1. Linux性能監控與調優工具
除了保證程序的正確性以外,在項目開發中往往還關心性能和穩定性。我們往往要對內核、應用程序或整個系統進行性能優化。在性能優化中常用的手段如下:
使用top、vmstat、iostat、sysctl等常用工具
top命令用於顯示處理器的活動狀況。在預設情況下,顯示佔用CPU最多的任務,並且每隔5s做一次刷新;vmstat命令用於報告關於內核線程、虛擬內存、磁碟、陷阱和CPU活動的統計信息;iostat命令用於分析各個磁碟的傳輸閑忙狀況;netstat是用來檢測網路信息的工具; sar用於收集、報告或者保存系統活動信息,其中,sar用於顯示數據,sar1和sar2用於收集和保存數據
sysctl是一個可用於改變正在運行中的Linux系統的介面。用sysctl 可以讀取幾白個以上的系統變數,如用sysctl—a可讀取所有變數。
sysctl的實現原理是:所有的內核參數在/proc/sys中形成一個樹狀結構,sysctl系統調用的內核函數是sys_sysctl,匹配項目後,最後的讀寫在do_sysctl_strategy中完成。
2.使用高級分析手段,如OProfile、gprof
OProfile可以幫助用戶識別諸如模塊的佔用時間、循環的展開、高速緩存的使用率低、低效的類型轉換和冗餘操作、錯誤預測轉移等問題。它收集有關處理器事件的信息,其中包括TLB的故障、停機、存儲器訪問以及緩存命中和未命中的指令的攫取數量。OProfile支持兩種采樣方式:基於事件的采樣(Event Based)和基於時間的采樣(Time Based)。基於事件的采樣是OProfile只記錄特定事件(比如L2緩存未命中)的發生次數,當達到用戶設定的定值時Oprofile就記錄一下(采一個樣)。這種方式需要CPU內部有性能計數器(Performace Counter))。基於時間的采樣是OProfile藉助OS時鍾中斷的機制,在每個時鍾中斷,OProfile都會記錄一次(采一次樣)。引入它的目的在於,提供對沒有性能計數器的CPU的支持,其精度相對於基於事件的采樣要低,因為要藉助OS時鍾中斷的支持,對於禁用中斷的代碼,OProfile不能對其進行分析。
2. Linux上TCP的幾個內核參數調優
Linux作為強大操作系統提供了豐富的內核參數進行調優,TCP內核參數調優尤其重要。本文聚焦於內網環境下的TCP參數調優,分享一些實踐經驗。
調優清單包括:tcp_max_syn_backlog、somaxconn、tcp_abort_on_overflow。這三個參數關聯內核TCP連接緩沖隊列,設定過小可能導致連接被無端丟棄,引起詭異現象,建議增大Backlog隊列大小以避免問題。
設置tcp_abort_on_overflow可避免連接被意外丟棄。同時,確保Java應用正確配置Backlog參數,避免默認值過小導致連接問題。
考慮tcp_tw_recycle參數可能帶來的負面影響,如NAT環境下連接成功率降低。高版本內核已優化此參數,如遇TIME_WAIT問題,調整相關參數可緩解。
優化tcp_syn_retries參數,設置合適的重傳次數以改善連接建立時的超時時間。Java應用通常可通過API設置超時時間,降低依賴於內核參數的重要性。
調整tcp_retries2參數,用於計算傳輸過程中的重傳次數,對特定場景如長ReadTimeout設置有顯著影響。優化此參數可減少宕機時的響應延遲,但資源隔離策略也是關鍵。
在物理機宕機與進程宕機情形下,內核行為存在差異。物理機宕機會導致內核發送reset,減輕線程阻塞問題。
考慮tcp_slow_start_after_idle參數,Linux默認開啟。關閉此參數可提高某些請求的傳輸速度,適用於網路條件變化頻繁的場景。在內網系統間調用中,通常無需啟用此功能。
初始CWND大小對請求速率有顯著影響。Linux 2.6.32及以前版本初始CWND為(2-4)個mss,現代版本調整為RFC 6928推薦的10段,即14K左右,更適合內網環境。
總之,Linux內核提供豐富參數供調優,選擇最適合當前環境的組合至關重要。潛心研究,找到最佳實踐,可顯著提升系統性能。