性能問題的定位

線上程序常出現的狀況是運行一段時間之後, 發現運行效率越來越差, 慢慢出現了累計或者相應慢的情況, 比較粗暴額解決方式是重啓程序, 一切都正常了。 但是過了一段時間問題又出現了, 我們需要藉助一些工具來定位爲。
通常我們的程序, 可以大致分爲3種類型:

  • 計算型, cpu、 內存使用比較多, 比如我們常見的緩存, 計算型流失數據分析等;
  • 存儲型, 磁盤IO使用比較多,通常的瓶頸在磁盤IO,比如數據庫存儲引擎, 存儲系統等;
  • 網絡資源消耗性, 比如網絡庫。

top

出現性能問題, 第一個能想到的就是用top來看下系統各個進程的cpu, 內存狀況是否異常。一般CPU的使用率超出了預期的太多, 意味着程序沒有合理利用CPU, 太低說明了程序沒有充分發揮CPU的功能, 要麼是併發沒有做好, 一般是加鎖太多或者不合理造成的;
另外一個方面就是內存的使用量, 物理內存是有限的, 一個進程使用了過多的內存, 必然導致其他的進程內存不足, 內存不足會加速數據頁在磁盤和內存之間的交換, 甚至使用SWAP內存, 性能會大大下降;另外, 要通過進程的監控程序, 看一下內存是否在持續的增長, 如果是, 可能有了內存泄漏, 內存泄漏也是導致程序變慢的常見問題。

iotop, vmstat

現在的機器, 磁盤空間一般不是什麼大的問題, 然而, 對於大數據而言, 磁盤IO, 尤其是系統盤的IO, 常常造成性能問題。
使用iostat來確認是否有某個盤的讀寫IO非常高的狀況:

iostat: 顯示一個cpu和磁盤的狀態信息;
iostat -d 2: 連續的顯示以2秒爲間隔的報告信息;
iostat -d 2 6: 顯示6個以2秒爲間隔的報告信息;
iostat -x sda sdb 2 6: 顯示磁盤sda, sdb的6個以2秒爲間隔的報告信息;

如果有, 可以通過iotop來找到具體哪一個進程導致的io問題, 它顯示的第一列就是進程id, 有時候我們該進程是某個腳本里面啓動的一個進程, 還可以通過ps -ef找到該進程的父進程, 然後定位到相應的程序。

iftop, netstat

一般的網絡性能問題,首先查看機器的網絡流量歷史, 看下是不是某段時間流量徒增, 超過了網絡帶寬, 這種情況下可以通過調整機器硬件的方法解決;
還可以通過iftop來定位當前的網絡流量狀態, 它可以顯示機器與其他主機之間的網絡流量,如果某個連接的流量非常高, 就需要分析一下相應的連接。
通過netstat來統計當前的各種TCP狀態的數量:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

可以得到各種狀態的數目, 我們通常比較關心的是TIME_WAIT和CLOSE_WAIT的個數,具體的TCP狀態可以參考這裏: TCP狀態圖, 可以調整內科參數來解決:

  • net.ipv4.tcp_syncookies = 1:表示開啓SYN Cookies。當出現SYN等待隊列溢出時,啓用cookies來處理,可防範少量SYN攻擊,默認爲0,表示關閉;

  • net.ipv4.tcp_tw_reuse = 1: 表示開啓重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認爲0,表示關閉;

  • net.ipv4.tcp_tw_recycle = 1: 表示開啓TCP連接中TIME-WAIT sockets的快速回收,默認爲0,表示關閉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章