提高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
改进硬件环境
閱讀更多 wendellFang 的文章