一、系統資源
通常服務器的性能會卡在四個地方:CPU、內存、網絡IO和磁盤IO。
二、性能調優
2.1 CPU
一個好的架構,服務器的CPU總消耗總是平均的分布在各個cpu上,CPU的消耗在70%左右。
1)使用多線程 或多進程編程,充分利用多核CPU。老的線程庫效率太低,需要升級用NPTL 。
2)進(線)程數不要遠超cpu數,減少進程無味的切換。
3)慎重選擇阻塞性IO,阻塞會導致進程切換,浪費CPU資源。
4)事件發生的時間無法估計或比較長,則不應該使用輪詢的方式,盡量用異步方式等待事件就緒。
5)謹慎用鎖,盡量把數據分配到各個線程,減少共享資源,減少競爭,lockfree。
6)類中有聯系的數據盡量放在相鄰的位置,可以放到一個cacheline里。
7)慎用字符串操作,比如sprintf,snprintf,因為%d %s等等都需要CPU資源去做詞法分析,數量多的話,也是不菲的開銷減少系統調用,例如time,主要消耗在用戶態和內核態之間的切換。
8)優化算法,減少遍歷操作。
9)優化架構,把系統管道調整到統一的半徑,解決瓶頸。
10)使用一些靜態池技術,比如內存池,線程池,連接池等,用空間換時間。
一個好的架構,服務器的CPU總消耗總是平均的分布在各個cpu上,CPU的消耗在70%左右。
2.2 內存
程序需要多少內存需要在設計的時候估計清楚,如果占用的內存接近物理內存,將會使用交換分區,影響性能。
2.3 網絡IO
1)使用epoll代替select
2)使用非阻塞的模式來開發
3)減少消息交互次數
4)數據流使用長鏈接
5)優化應用層協議
6) 使用DPDK
2.4 磁盤IO
1)內存中緩存寫入磁盤的數據,批量寫磁盤,減少寫入次數
2)利用順序寫,減少尋道次數
3)內存緩存熱點數據,緩解磁盤讀壓力
4)對磁盤IO密集型的服務使用SSD盤
三、常用工具
3.1 top(CPU&內存)
可以查看系統中運行的進程的狀況,CPU使用狀況,系統負載,內存使用等。它是檢查系統進程運行狀況最方便的工具了,它默認顯示部分活動的進程,并且按照進程使用CPU的多少排序。它可以顯示全部CPU的使用狀況,也可以顯示每個進程都運行在那個CPU上面。
主要可以用top來看哪些進程或者哪類進程占用CPU和內存資源最多,以此迅速定位存在性能問題的進程,以及運行異常的進程。
load average: 0.06, 0.60, 0.48 - 系統負載,即任務隊列的平均長度。 三個數值分別為 1分鐘、5分鐘、15分鐘前到現在的平均值。這個值最好小于0.7,一般大于0.7說明需要調優。
%CPU這個字段在多線程多核的環境中會超過100。
3.2 free(內存)
free命令顯示系統內存的使用狀況(物理內存和交換內存)通過這個命令我們可以看到系統進程實際使用的物理內存,buffer和cache使用的物理內存。
第二行的used/free是OS角度,包括buffer和cache使用的內存。
第三行的used/free是用戶角度,不包括buffer和cache使用的內存。
3.3 vmstat(綜合)
vmstat是一個很全面的性能分析工具,可以觀察到系統的進程狀態、內存使用、虛擬內存使用、磁盤的IO、中斷、上下問切換、CPU使用等。
Procs
- r:運行的和等待(CPU時間片)運行的進程數,這個值也可以判斷是否需要增加CPU(長期大于1)
- b:處于不可中斷狀態的進程數,常見的情況是由IO引起的
Memory 類似free命令
Swap
- si: 交換內存使用,由磁盤調入內存
- so: 交換內存使用,由內存調入磁盤
內存夠用的時候,這2個值都是0,如果這2個值長期大于0時,系統性能會受到影響。磁盤IO和CPU資源都會被消耗。
IO
- bi: 從塊設備讀入的數據總量(讀磁盤) (KB/s),
- bo: 寫入到塊設備的數據總理(寫磁盤) (KB/s)
- 隨機磁盤讀寫的時候,這2個 值越大,能看到CPU在IO等待的值也會越大
System
- in: 每秒產生的中斷次數
- cs: 每秒產生的上下文切換次數
- 上面這2個值越大,會看到由內核消耗的CPU時間會越多
CPU
- us: 用戶進程消耗的CPU時間百分比
- us 的值比較高時,說明用戶進程消耗的CPU時間多
- sy: 內核進程消耗的CPU時間百分比
- sy 的值高時,說明系統內核消耗的CPU資源多,這并不是良性的表現,我們應該檢查原因。
- wa: IO等待消耗的CPU時間百分比
- wa 的值高時,說明IO等待比較嚴重,這可能是由于磁盤大量作隨機訪問造成,也有可能是磁盤的帶寬出現瓶頸(塊操作)。
- id: CPU處在空閑狀態時間百分比
3.4 Strace(CPU)
可以用來查看一個進程在執行過程中的系統調用和所接收的信號。
3.5 tcpdump(網絡)
linux下的抓包工具。可以把抓下來的信息重定向到文件里。然后在windows下用ethereal來分析。很強大
3.6 gprof(CPU)
- 程序中每個函數的CPU使用時間。
- 每個函數的調用次數。并提供簡單調用關系圖。
使用步驟:
- 用gcc或g++編譯程序時,使用-pg參數
- 執行編譯得到的運行程序,會產生一個gmon.out文件
- 使用gprof命令。查看結果信息。(gprof -b proc_name gmon.out | less)
3.7 dstat (綜合)
dstat 是一個可以取代vmstat,IOStat?.NETstat和ifstat這些命令的多功能產品。dstat克服了這些命令的局限并增加了一些另外的功能,增加了監控項,也變得更靈活了。dstat可以很方便監控系統運行狀況并用于基準測試和排除故障。
3.8 mpstat (CPU)
它能實時監測多處理器上每個CPU的使用情況。
3.9 perf (CPU)
perf top命令可以查看哪些內核調用或用戶調用的性能。另外perf stat通過概括精簡的方式提供被調試程序運行的整體情況和匯總數據。
3.10 lsof (文件)
它能列出當前系統打開的文件描述符,可以看到哪些進程打開了哪些文件。文件描述符有兩個層次的概念:用戶級限制和系統限制,用戶級限制可以通過ulimit
-n查看,系統級限制可以通過sysctl
-a命令查看,其中fs.file-max是整個系統共能打開的文件描述符,epoll.max_user_watches是一個用戶能往epoll內核事件表中注冊的事件總量,往epoll內核事件表中注冊一個事件,在32位系統上大概消耗90字節的內核空間,在64位系統上則消耗160字節的內核空間。
3.11 netstat (網絡)
可以打印本地網卡接口上的全部連接,路由表信息,網卡接口信息等,一般用netstat -apn
3.12 ifstat (網絡)
它是一個網絡流量監測工具,可以輸出各個網卡的in/out流量信息。
3.13 iostat (磁盤)
它主要用于監控系統設備的IO負載情況。
3.14 nc (調試工具)
主要用來快速構建網絡連接??梢宰屗苑掌鞣绞竭\行,監聽某個端口并接收客戶連接,可以用于調測客戶端程序。也可以使之以客戶端方式運行,向服務器發起連接并收發數據,可以用于調試服務器程序。
文章來源:
https://www.jianshu.com/p/316b17acde6a






