提高服务器程序性能的一些方法
1. 锁的使用
锁是影响服务器程序性能的第一大杀手。服务器程序一般都是多线程或是多线程的,锁肯定避免不了。对于锁的使用,第一点就是减小锁的粒度。比如mysql有行锁,表锁,各种粒度不同的锁。在需要加锁的地方,选择粒度最小的锁。第二点,使用一些高性能的锁,比如读写锁,自旋锁。这个要根据具体的应用场景来选择。另外还有一些应用级别的锁,比如电商系统里面,用来减库存的乐观锁,与其对应的则是悲观锁。另外,还可以通过优化代码,来达到无锁化操作。
2. 内存使用
在一个内存操作密集型的服务器程序上,对内存的使用优化肯定也是必不可少的。首先,是使用内存池,来避免内存的频繁申请与释放。其次,减少不必要的memset与memcpy。比如,我们的流媒体服务器,发送媒体流的过程就是一个不断申请释放内存的操作。对于申请的内存,我们就没必要给它清零,因为发送的时候,都会指定发送长度。申请的内存使用了多少,就发送多少,不需要上来就清零。对于内存拷贝而言,比如我们在写网络程序时,socket收到的数据包会读到一块缓存里面,那么在解析的时候,尽量不要再将数据拷贝到另一块内存上解析。我们还可以自己实现memcpy等函数,利用cpu的特性,每次操作4个字节或是8个字节,根据操作系统的位数决定。还有就是尽量减少用户空间与内核空间的内存拷贝操作,比如使用一些零拷贝的函数,sendfile ,mmap等
3. 多线程
服务器程序,应该禁止动态创建线程。所有的线程应该在程序初始化时就创建,直至程序运行结束。当然也有一些场景,可以惰性化开启。比如在业务第一次触发时,开启相应线程,之后就不需要再关闭了。对于线程池的使用,要选择合理的线程个数。线程太小,无法发挥处理器的多核优势;线程太多,系统会消耗很多性能在线程切换上。一般来说,线程的数量是处理器核心数量的两倍
4. 网络
高并发离不开网络性能,I/O密集型的程序,linux上使用epoll, bsd上的kquene,windows有iocp,这些就不细讲了,之前的博文中有介绍
5.异步化
服务器之间相互依赖的接口,尽量实现成异步的,这样就不需要阻塞调用线程,减少因为网络原因引起的等待
6.与客户端的交互
所有的服务器都给客户端提供服务,应该尽量减少与客户端的交互过程。即做到在每次交互中,处理更多的事情。比如我们自己实现的流媒体服务器,刚开始点播流的时候,要发一些信令报文。之前我们需要三次交互,才能开始发流,后来通过消息合并,节省了一步。不要小看这一小步,在网络不好的情况下,可能就会减少很多点播时延
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- xmuC语言程序实践week 3 大作业
- xmuC语言程序实践week 4 大作业
- R语言预测人口死亡率:用李·卡特(Lee-Carter)模型、非线性模型进行平滑估计
- 前端的发展历程
- R语言蒙特卡洛计算和快速傅立叶变换计算矩生成函数
- Visual Studio 中万能头文件编译不了的解决方案
- Difference in two ways of using lower_bound [C++]std::set::lower_bound与std::lower_bound
- 迷你版Vue--学习如何造一个Vue轮子
- 如何用R语言绘制生成正态分布图表
- hdu 5143 NPY and arithmetic progression(暴力+思维)
- 正则表达式之简易markdown文件解析器
- 2015.CCF计算机软件能力认证试题第二题
- Codeforces Round #547 (Div. 3)A. Game 23
- Codeforces Round #547 (Div. 3)C. Polycarp Restores Permutation
- 动态规划入门_数塔问题