提高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 的文章