提高服务器程序性能的一些方法

2018-01-17 09:42:24 浏览数 (1)

1. 锁的使用

锁是影响服务器程序性能的第一大杀手。服务器程序一般都是多线程或是多线程的,锁肯定避免不了。对于锁的使用,第一点就是减小锁的粒度。比如mysql有行锁,表锁,各种粒度不同的锁。在需要加锁的地方,选择粒度最小的锁。第二点,使用一些高性能的锁,比如读写锁,自旋锁。这个要根据具体的应用场景来选择。另外还有一些应用级别的锁,比如电商系统里面,用来减库存的乐观锁,与其对应的则是悲观锁。另外,还可以通过优化代码,来达到无锁化操作。

2. 内存使用

在一个内存操作密集型的服务器程序上,对内存的使用优化肯定也是必不可少的。首先,是使用内存池,来避免内存的频繁申请与释放。其次,减少不必要的memset与memcpy。比如,我们的流媒体服务器,发送媒体流的过程就是一个不断申请释放内存的操作。对于申请的内存,我们就没必要给它清零,因为发送的时候,都会指定发送长度。申请的内存使用了多少,就发送多少,不需要上来就清零。对于内存拷贝而言,比如我们在写网络程序时,socket收到的数据包会读到一块缓存里面,那么在解析的时候,尽量不要再将数据拷贝到另一块内存上解析。我们还可以自己实现memcpy等函数,利用cpu的特性,每次操作4个字节或是8个字节,根据操作系统的位数决定。还有就是尽量减少用户空间与内核空间的内存拷贝操作,比如使用一些零拷贝的函数,sendfile ,mmap等

3. 多线程

服务器程序,应该禁止动态创建线程。所有的线程应该在程序初始化时就创建,直至程序运行结束。当然也有一些场景,可以惰性化开启。比如在业务第一次触发时,开启相应线程,之后就不需要再关闭了。对于线程池的使用,要选择合理的线程个数。线程太小,无法发挥处理器的多核优势;线程太多,系统会消耗很多性能在线程切换上。一般来说,线程的数量是处理器核心数量的两倍

4. 网络

高并发离不开网络性能,I/O密集型的程序,linux上使用epoll, bsd上的kquene,windows有iocp,这些就不细讲了,之前的博文中有介绍

5.异步化

服务器之间相互依赖的接口,尽量实现成异步的,这样就不需要阻塞调用线程,减少因为网络原因引起的等待

6.与客户端的交互

所有的服务器都给客户端提供服务,应该尽量减少与客户端的交互过程。即做到在每次交互中,处理更多的事情。比如我们自己实现的流媒体服务器,刚开始点播流的时候,要发一些信令报文。之前我们需要三次交互,才能开始发流,后来通过消息合并,节省了一步。不要小看这一小步,在网络不好的情况下,可能就会减少很多点播时延

0 人点赞