linux 服務器性能分析及優化的一些方法

1. 首先查看網絡連接數

netstat -an 

或者 ss -s 進行統計,如果帶上-p參數的話當連接數比較多的時候就會比較慢

或者查看系統:

/proc/net/sockstat:

sockets: used 160
TCP: inuse 0 orphan 0 tw 0 alloc 4 mem 0
UDP: inuse 0 mem 1
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

2. 系統dmesg提示 socket out of memory

首先查看系統socket使用了多少,參考1.

3. 查看系統給tcp分配的內存大小限制

cat /proc/sys/net/ipv4/tcp_rmem #tcp read buffer bytes

4096 87380 629145

第一項是buffer最小4096字節,第二項是默認值87380字節,第三項是read buffer 最大限制629145 字節

 cat /proc/sys/net/ipv4/tcp_wmem #tcp write buffer bytes

write buffer與read buffer類似
cat /proc/sys/net/ipv4/tcp_mem #tcp memory pages
21498 28665 42996

第一個值是內存使用的下限;第二個值是內存壓力模式開始對緩衝區使用應用壓力的上限;第三個值是內存使用的上限。在這個層次上可以將報文丟棄,從而減少對內存的使用socket out of memory。可以結合sockstat裡的統計數據分析tcp使用內存是否超過了限制,注意這裡單位是頁,查看頁大小getconf PAGESIZE

另外可以查看tcp讀寫發送窗口默認值:

\t/proc/sys/net/core/rmem_default
\t/proc/sys/net/core/rmem_max
\t/proc/sys/net/core/wmem_default
\t/proc/sys/net/core/wmem_max

另外socket out of memory 也有可能是孤兒socket過多導致的。

4. 內核配置最大的孤兒socket數:

cat /proc/sys/net/ipv4/max_orphans

4096

查看孤兒socket

\tcat /proc/net/sockstat 
\tsockets: used 403
\tTCP: inuse 4 orphan 0 tw 0 alloc 10 mem 1
\tUDP: inuse 12 mem 7
\tUDPLITE: inuse 0
\tRAW: infuse 0
\tFRAG: inuse 0 memory 0

注意這裡的orphan 往往會被內核x2 或者x4,所以有時候看到這裡的orphan數比較小,但是卻有out of socket memory的提示,有可能就是這個放大倍數導致的。關於孤兒socket 可以參考:孤兒socket

5. 一個tcp socket佔用多大內存

首先socket包括本地ip、端口,對端ip、端口;發送、接收緩衝區等(跟配置有關)。

如果按照上面最小的讀寫緩衝區來算那麼一個socket大概佔用8K的內存。

如果單從一個socket佔用的內存來看,一個8GB的內存,一般情況下可以承受100萬得sock長連接,前提是系統文件句柄要調大

tcp內存最大也要進行調整。

tcp內核參數調優

tcp參數調優

6. 查看系統總共使用了多少文件描述符

\tcat /proc/sys/fs/file-nr
\t4096 0 9000

第一項就是當前系統已經打開的文件句柄(包括socket ),最後一項是整個系統最大可以打開的文件句柄數

cat /proc/sys/fs/file-max

系統最大的文件句柄數

cat /proc/sys/fs/nr_open

1048576

系統配置的單個進程最大可以打開的文件句柄數

7.dmesg or dmesg -T

查看內核的錯誤信息,比如tcp鏈接太多,句柄不夠用,內存不足導致某些進程被kill掉

8. 使用slabtop 查看內核內存分配

iostat -d 1 10 -x

9. 查看系統統計

vmstat -n 1 10

可以通過該命令動態觀察swap內存是否在發生變化,如果一直在增長,那麼可以初步斷定 系統內存不夠用。

當cache、buffer佔用大量內存是可以通過調整內核參數釋放改內存:

$sync (必須要先執行)

$ echo “3” > /proc/sys/vm/drop_caches (該值默認是0,不釋放)

10. tcp keepalive time 如果想開啟tcp 半打開狀態的連接的回收,單單配置keep alive是不夠的,需要在程序中調用setsockopt 開啟探測功能,否則即使系統側配置了keepalive time也是不夠的。

11. top 然後按數字1,看各個cpu是否存在不均衡的情況,如果是則看下系統軟中斷一列的cpu是否使用過高,如果是則進一步確認是不是網卡軟中斷引起的:

linux 服務器性能分析及優化的一些方法

Fig 1:各個cpu使用情況

下圖是系統中斷在各個cpu的分佈,通過分析上下兩個圖就可以知道是不是因為網卡導致軟中斷過高,如果是網卡收發包軟中斷過高則需要進行多網卡隊列配置優化或者是收發包軟中斷優化(RPS/RFS)

linux 服務器性能分析及優化的一些方法

查看網卡是否支持多網卡隊列可以通過以下命令:

ethtool -L eth0

RPS/RFS 優化配置(原理就是根據四元組進行hash選則對應的CPU進行CPU負載均衡、提升CPU緩存命中率):

RPS:

RPS指定哪些接收隊列需要通過rps平均到配置的cpu列表上。

/sys/class/net/(dev)/queues/rx-(n)/rps_cpus

RFS:

每個隊列的數據流表總數可以通過下面的參數來設置:

該值設置成rps_sock_flow_entries/N,其中N表示設備的接收隊列數量。

/sys/class/net/(dev)/queues/rx-(n)/rps_flow_cnt

全局數據流表(rps_sock_flow_table)的總數,紅帽是建議設置成32768,一般設置成最大併發鏈接數量

/proc/sys/net/core/rps_sock_flow_entries


分享到:


相關文章: