如何提高服务器并发能力

提高CPU并发计算能力

①  多进程&多线程:

多进程优点:不仅能够提高CPU的并发度,独占内存空间以及生命周期(具备一定稳定性以及健壮性,一个进程崩溃不会影响其他进程)

多进程缺点:fork()系统调用开销很大(prefork);进程间调度和上下文切换成本高(减少进程数);庞大的内存重复(共享内存);ICP编程相对比较麻烦

②  减少进程切换:

Nmon工具可监测服务器每秒上下文切换次数;

最简单做法就是减少进程数,尽量使用线程并配合其他IO模型来设计并发;

进程绑定CPU技术,增加CPU缓存命中率

③  减少不必要的锁

④  考虑进程优先级

⑤  考虑系统负载:可查看/proc/loadavg,top中的average可查

⑥  考虑CPU使用率

考虑减少内存分配和释放

①  改善数据结构,算法;

②  服务器本身使用各自的策略;

apache,运行开始时候一次性申请大片内存池;

nginx使用多线程处理请求,多个线程共享内存资源;分阶段内存分配策略,按需分配,及时释放

③  共享内存

考虑使用持久连接(长连接)

①  建立一次TCP连接持续发送多次分数据而不断开连接

②  目前大多数浏览器支持长连接,http请求头中的Connection:Keep-Alive

改进I/O模型

①  DMA技术

I/O设备和内存之间的数据传输方式由DMA控制器完成。在DMA模式下,CPU只需要向DMA下达命令,由DMA控制器来处理数据的传送。

②  异步I/O(非阻塞)

③  I/O多路复用,epoll

④  Sendfile

服务器静态资源,磁盘文件—>内核缓冲区—>用户内存空间—>网卡内核缓冲区—>网卡—>发送

Linux提供sendfile()系统调用,可以将磁盘文件特定部分直接传送到客户端的socket描述符,加快了静态文件的请求速度,同时减少CPU和内存的开销。使用场景:大文件请求效果很明显。

⑤  内存映射

Linux提供一种访问磁盘文件的特殊方式,可以将内存中某块地址空间和指定磁盘文件相关联。内存—>磁盘文件,效果:访问内存一样访问磁盘文件

缺点:处理大文件时候,内存映射会导致较大内存开销,得不偿失

⑥  直接I/O,绕过内核缓冲区

Mysql,对于Innodb殷勤,自身进行数据和索引的缓存管理,可在my.cnf中配置分配raw分区跳过内核缓冲区,实现直接I/O

改进服务器并发策略,一个线程处理多个连接,异步IO

改进硬件环境


分享到:


相關文章: