部分內容轉自:如何優化服務器的性能 - 南風軒 - 博客園
網絡內核參數:blog.csdn.net/ysdaniel/article/details/7307091
陳皓性能調優攻略:coolshell.cn/articles/7490.html
1、系統資源
CPU 內存 磁盤IO 網絡IO
2、性能調優
性能調優一般從以下幾個方面入手。
(1)先看load(w,top,uptime),如果load高,說明系統某些資源出現了瓶頸,可以通過dstat和vmstat查看cpu,memory,IO哪些出現瓶頸,然后再具體看原因。
(2)有可能load不高,但就是響應時間比較長,這種情況可能是由于阻塞造成的,常見的比如工作線程都在等待某個事件發生,導致不能及時處理請求。
(3)還有一種情況是沒有利用多核并發,比如某個耗時的任務只有一個線程處理,導致這個線程處理不過來造成流程上的阻塞,這種可以通過mpstat查看是不是集中在某一個或某幾個核上。
(4)還有一種原因是內核代碼導致的,比如不支持多隊列的網卡上沒有打開RFS,導致內核處理網絡的邏輯沒有負載在多個核上,這時候需要調整內核參數。
CPU
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%左右。
內存
程序需要多少內存需要在設計的時候估計清楚,如果占用的內存接近物理內存,將會使用交換分區,影響性能。
網絡IO
1)使用epoll代替select
2)使用非阻塞的模式來開發
3)減少消息交互次數
4)數據流使用長鏈接
5)優化應用層協議
6) ? 使用DPDK
磁盤IO
1)內存中緩存寫入磁盤的數據,批量寫磁盤,減少寫入次數
2)利用順序寫,減少尋道次數
3)內存緩存熱點數據,緩解磁盤讀壓力
4)對磁盤IO密集型的服務使用SSD盤
3、常用命令
1)dstat (綜合)
dstat 是一個可以取代vmstat,iostat,netstat和ifstat這些命令的多功能產品。dstat克服了這些命令的局限并增加了一些另外的功能,增加了監控項,也變得更靈活了。dstat可以很方便監控系統運行狀況并用于基準測試和排除故障。
2)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) 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。
4)mpstat (CPU)
它能實時監測多處理器上每個CPU的使用情況。
5)perf (CPU)
perf top命令可以查看哪些內核調用或用戶調用的性能。另外perf stat通過概括精簡的方式提供被調試程序運行的整體情況和匯總數據。
6)strace (CPU)
可以用來查看一個進程在執行過程中的系統調用和所接收的信號。
7)gprof (CPU)
程序中每個函數的CPU使用時間。
每個函數的調用次數。并提供簡單調用關系圖。
使用步驟:
用gcc或g++編譯程序時,使用-pg參數
執行編譯得到的運行程序,會產生一個gmon.out文件
使用gprof命令。查看結果信息。(gprof -b proc_name gmon.out | less)
8)lsof (文件)
它能列出當前系統打開的文件描述符,可以看到哪些進程打開了哪些文件。文件描述符有兩個層次的概念:用戶級限制和系統限制,用戶級限制可以通過ulimit
-n查看,系統級限制可以通過sysctl
-a命令查看,其中fs.file-max是整個系統共能打開的文件描述符,epoll.max_user_watches是一個用戶能往epoll內核事件表中注冊的事件總量,往epoll內核事件表中注冊一個事件,在32位系統上大概消耗90字節的內核空間,在64位系統上則消耗160字節的內核空間。
9)free (內存)
free命令顯示系統內存的使用狀況(物理內存和交換內存)通過這個命令我們可以看到系統進程實際使用的物理內存,buffer和cache使用的物理內存。
第二行的used/free是OS角度,包括buffer和cache使用的內存。
第三行的used/free是用戶角度,不包括buffer和cache使用的內存。
10)netstat (網絡)
可以打印本地網卡接口上的全部連接,路由表信息,網卡接口信息等,一般用netstat -apn
11)ifstat (網絡)
它是一個網絡流量監測工具,可以輸出各個網卡的in/out流量信息。
12) tcpdump (網絡網絡)
linux下的抓包工具。可以把抓下來的信息重定向到文件里。使用wireshark打開。
13)iostat (磁盤)
它主要用于監控系統設備的IO負載情況。
14)nc (調試工具)
主要用來快速構建網絡連接。可以讓它以服務器方式運行,監聽某個端口并接收客戶連接,可以用于調測客戶端程序。也可以使之以客戶端方式運行,向服務器發起連接并收發數據,可以用于調試服務器程序。
4、開發運維
代碼中跟服務器資源相關的參數,包括連接數(內存 64G 200萬),線程數(虛擬cpu數),qps(cpu busy),各種緩存(buffer)首先要做到可以靜態配置,再高一點要求要做到動態配置,最終要做到代碼可以根據服務器資源使用情況智能調整,同時還要有有效的服務降級策略,保證服務可用。