1. 程式人生 > >linux中對socket的理解 socket高併發

linux中對socket的理解 socket高併發

1.socket是什麼? 其實準確的來說,socket並不僅僅用於linux而已,它也應用於TCP/IP中。籠統的來說,socket就是指的“IP地址+埠號”。比如我有一個ssh伺服器A,這時候我有兩個終端通過ssh協議登陸到伺服器A上面,那麼這時候伺服器上建立的socket連線數就是2個,那麼這兩個socket的連線狀態就是establish。但是socket不僅僅應用與TCP/IP中,它有兩個域,一個是internet domain,也就是一開始說的“IP地址+埠號”,通過網路來建立連線;而另外一個就是unix domain,而它也屬於socket,則是兩個程序共用一套檔案系統以此通訊,也就是主機內部執行緒之間的通訊哦。 2.如何檢視socket連線? ss(socket statistics)命令可以獲取socket連線資訊,有點類似於netstat,但是它比netstat更強大,可以顯示更詳細的socket資訊。它使用了tcp協議棧中的tcp_diag模組,能直接第一時間入手核心資訊。 以下是ss命令的用法: ss [引數] 如果不加任何引數,則ss會列出所有已經建立連線並不處於listen狀態的socket連線 -s 顯示socket概要統計,summary的意思 -n 以埠號顯示socket連線 -p 以程序服務名稱顯示socket連線 -l 顯示處在listen狀態的socket連線 -t 只顯示tcp的socket連線 -u 只顯示udp的socket連線 -a 顯示所有的socket連線,包括listen狀態在內的socket連線 3.應用舉例 檢視socket的概覽

[[email protected]01 ~]$ ss -s
Total: 294 (kernel 0)
TCP:   8 (estab 2, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0

Transport Total     IP        IPv6
*      0         -         -        
RAW      1         0         1        
UDP      7         4         3        
TCP      8         5         3
INET 16 9 7 FRAG 0 0 0
這裡著重介紹一下ss -s中的synrecv引數:這裡的synrecv狀態代表著tcp3次握手中的第二次握手,如果這裡的數值較大,一般可以斷定為syn攻擊。 注意:netstat -anp|grep 'SYN_RECV'同樣可以檢視到處於synrecv狀態的socket連線哦,只不過本講只側重於ss來講的。 檢視所有的tcp socket連線並暴露埠號

[[email protected]01 ~]$ ss -ant
State       Recv
-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:111 *:* LISTEN
0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* ESTAB 0 0 10.211.55.3:22 10.211.55.2:53356 ESTAB 0 0 10.211.55.3:22 10.211.55.4:43636 LISTEN 0 128 :::111 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::*
檢視所有的udp連線並顯示程序名

[[email protected]01 ~]$ ss -aup
State       Recv-Q Send-Q                               Local Address:Port                                                Peer Address:Port                
UNCONN      0      0                                                *:bootpc                                                         *:*                    
UNCONN      0      0                                                *:sunrpc                                                         *:*                    
UNCONN      0      0                                                *:757                                                            *:*                    
UNCONN      0      0                                        127.0.0.1:323                                                            *:*                    
UNCONN      0      0                                               :::sunrpc                                                        :::*                    
UNCONN      0      0                                               :::757                                                           :::*                    
UNCONN      0      0                                              ::1:323                                                           :::*  
4.在linux中如何保證socket連線的高併發量? 要想提高socket的高併發,要從兩個方面下手。 一、修改linux使用者程序所能開啟的檔案最大數值 第一步,首先檢視當前使用者每個程序所能開啟的最大檔案數
[[email protected]01 ~]# ulimit -n
1024
1024【這表示當前使用者的每個程序最多允許同時開啟1024個檔案,這1024個檔案中還得除去每個程序必然開啟的標準輸入,標準輸出,標準錯誤,伺服器監聽 socket,程序間通訊的unix域socket等檔案,也就是實際所能開啟的檔案數還不到1024】 /etc/security/limits.conf檔案限制著使用者可以使用的最大檔案數,最大執行緒,最大記憶體等資源使用量。 修改limits.conf檔案,在下面加入: user soft nofile 10240 user hard nofile 10240 其中user指定了要修改哪個使用者的開啟檔案數限制,可用’*'號表示修改所有使用者的限制;soft或hard指定要修改軟限制還是硬限制;10240則指定了想要修改的新的限制值,即最大開啟檔案數(請注意軟限制值要小於或等於硬限制)。修改完後儲存檔案。 修改/etc/pam.d/login檔案,在檔案中新增如下行: session required /lib/security/pam_limits.so 這是告訴Linux在使用者完成系統登入後,應該呼叫pam_limits.so模組來設定系統對該使用者可使用的各種資源數量的最大限制(包括使用者可開啟的最大檔案數限制),而pam_limits.so模組就會從/etc/security/limits.conf檔案中讀取配置來設定這些限制值。修改完後儲存此檔案。 第三步,檢視Linux系統級的最大開啟檔案數限制,使用如下命令,如果滿意就不需要進行下面操作

[[email protected]01 ~]# cat /proc/sys/fs/file-max 
97132
97132【這表明這臺Linux系統最多允許同時開啟(即包含所有使用者開啟檔案數總和)12158個檔案,是Linux系統級硬限制,所有使用者級的開啟檔案數限制都不應超過這個數值。通常這個系統級硬限制是Linux系統在啟動時根據系統硬體資源狀況計算出來的最佳的最大同時開啟檔案數限制,如果沒有特殊需要,不應該修改此限制,除非想為使用者級開啟檔案數限制設定超過此限制的值。】 修改此係統硬限制的方法是修改/etc/rc.local指令碼,在指令碼中新增如下行: echo 99999> /proc/sys/fs/file-max 二、調整網路核心對TCP連線的最大支援數。 /etc/sysctl.conf檔案是linux中的網路核心配置檔案,通過修改它我們可以做到socket程序在TCP/IP網路連線數優化,具體操作: 第一步:設定本地埠範圍 net.ipv4.ip_local_port_range = 1024 65000 【這表明將系統對本地埠範圍限制設定為1024~65000之間。請注意,本地埠範圍的最小值必須大於或等於1024;而埠範圍的最大值則應小於或等於65535。修改完後儲存此檔案。】 第二步:設定系統對tcp連線跟蹤的最大數限制 net.ipv4.ip_conntrack_max = 10240 這表明將系統對最大跟蹤的TCP連線數限制設定為10240。請注意,此限制值要儘量小,以節省對核心記憶體的佔用。 第三步:執行sysctl -p使其立即生效