如何提高服務器併發能力

提高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

改進硬件環境


分享到:


相關文章: