Linux伺服器高併發實踐經歷

2021-09-07 09:31:40 字數 3925 閱讀 4526

作為乙個**離職早的野生程式設計師,業務方面還可以達到忽悠別人的水平,但上公升到效能層面那就是硬傷。

真是天上掉餡餅,公司分配了乙個測試效能的任務,真是感覺我的天空星星都亮了。

高併發主要限制因素:cpu、網路流量、記憶體、系統配置

用top看cpu利用率,按1檢視每個cpu執行緒的工作情況;這裡面會顯示出cpu的空閒、利用率、軟中斷等狀態

如果某個cpu執行緒使用率經常達到100%,那cpu就成了瓶頸,通常為了實現高併發,負載比較大的服務程式會自己繫結cpu,使自己的任務分配到多個cpu執行緒中去,以保證程式穩定執行

繫結cpu的方法:

ncpuindex 表示 cpu 序號,從 0 開始編號。

cpu_set_t mask;

cpu_zero(&mask);

cpu_set(ncpuindex, &mask);

sched_setaffinity(m_hthread, sizeof(mask), &mask);

當然yum install irqbalance也是乙個不錯的選擇。

對於流**伺服器來說,網絡卡絕對是主要瓶頸,即使是萬兆網絡卡,面對1mbps的碼流,併發也只有1萬;

網絡卡流量主要通過dstat -n來指定多網絡卡進行監控,在單機測試過程中,就需要ccie的支援了:

(1)首先用bond(mod4)繫結多個網絡卡,但是相應的萬兆交換機也需要與伺服器這邊一致。

這邊有個知識點就是「多網絡卡繫結的七種模式」,好的交換機支援更多的網口負載方式,會讓各網口流量基本均衡。

如果配置差錯,在dstat統計的過程中就會發現,有些網絡卡流量滿了,但是有些卻沒有流量,導致測試例項大量掉線;

dstat功能很全,cpu、記憶體都可以指定,比如read列流量高,就表明程式讀寫磁碟的操作比較頻繁。

(2)另外,網絡卡cpu中斷也最好要進行確認:

檢視當前網絡卡的終端號:cat /proc/interrupts | grep eth1

檢視當前網絡卡分配的cpu(98是第一步的結果):cat /proc/irq/98/smp_affinity_list

將比較空閒的cpu分配給該網絡卡:echo 1,2,3 >/proc/irq/98/smp_affinity_list

可以用top、free -m等檢視,反正耗得太多就是程式的問題了。free的各個值也可以看出程式的執行原理。

[root@cdn02 ~]# free -m

total used free shared buffers cached

mem: 31993 1596 30397 0 12 22

-/+ buffers/cache: 1562 30431

swap: 15999 7 15992

otal——總物理記憶體

used——已使用記憶體,一般情況這個值會比較大,因為這個值包括了cache+應用程式使用的記憶體

free——完全未被使用的記憶體

shared——應用程式共享記憶體

buffers——快取,主要用於目錄方面,inode值等(ls大目錄可看到這個值增加)

cached——快取,用於已開啟的檔案

note:

total=used+free

used=buffers+cached (maybe add shared also)

第二行描述應用程式的記憶體使用:

前個值表示-buffers/cache——應用程式使用的記憶體大小,used減去快取值

後個值表示+buffers/cache——所有可**用程式使用的記憶體大小,free加上快取值

note:

-buffers/cache=used-buffers-cached

+buffers/cache=free+buffers+cached

第三行表示swap的使用:

used——已使用

free——未使用

之前都是玩虛擬機器,

檔案描述符神馬的一般配置成65535也就沒發現什麼問題,

也不會認為處於time_wait狀態的socket有什麼不好

但是這些對於高併發的伺服器來說卻是非常重要的

頻繁的http服務會建立大量的短連線,就會有大量的time_wait在2ml的超時時間內,占用描述符,

如果恰巧配置的系統最大描述符又很小,效能當然也就上不去。

系統配置主要是修改:/etc/sysctl.conf 檔案,修改之後sysctl -p進行更新

net.ipv4.tcp_max_tw_buckets = 6000

timewait 的數量,預設是180000。

net.ipv4.ip_local_port_range = 1024 65000

允許系統開啟的埠範圍。

net.ipv4.tcp_tw_recycle = 1

啟用timewait 快速**。

net.ipv4.tcp_tw_reuse = 1

開啟重用。允許將time-wait sockets 重新用於新的tcp 連線。

net.ipv4.tcp_syncookies = 1

開啟syn cookies,當出現syn 等待佇列溢位時,啟用cookies 來處理。

net.core.somaxconn = 262144

web 應用中listen 函式的backlog 缺省會給我們核心引數的net.core.somaxconn 限制到128,而nginx 定義的ngx_listen_backlog 預設為511,所以有必要調整這個值。

net.core.netdev_max_backlog = 262144

每個網路介面接收資料報的速率比核心處理這些包的速率快時,允許送到佇列的資料報的最大數目。

net.ipv4.tcp_max_orphans = 262144

系統中最多有多少個tcp 套接字不被關聯到任何乙個使用者檔案控制代碼上。如果超過這個數字,孤兒連線將即刻被復位並列印出警告資訊。這個限制僅僅是為了防止簡單的dos 攻擊,不能過分依靠它或者人為地減小這個值,更應該增加這個值(如果增加了記憶體之後)。

net.ipv4.tcp_max_syn_backlog = 262144

記錄的那些尚未收到客戶端確認資訊的連線請求的最大值。對於有128m 記憶體的系統而言,預設值是1024,小記憶體的系統則是128。

net.ipv4.tcp_timestamps = 0

時間戳可以避免序列號的捲繞。乙個1gbps 的鏈路肯定會遇到以前用過的序列號。時間戳能夠讓核心接受這種「異常」的資料報。這裡需要將其關掉。

net.ipv4.tcp_synack_retries = 1

為了開啟對端的連線,核心需要傳送乙個syn 並附帶乙個回應前面乙個syn 的ack。也就是所謂三次握手中的第二次握手。這個設定決定了核心放棄連線之前傳送syn+ack 包的數量。

net.ipv4.tcp_syn_retries = 1

在核心放棄建立連線之前傳送syn 包的數量。

net.ipv4.tcp_fin_timeout = 1

如果套接字由本端要求關閉,這個引數決定了它保持在fin-wait-2 狀態的時間。對端可以出錯並永遠不關閉連線,甚至意外當機。預設值是60 秒。2.2 核心的通常值是180 秒,3你可以按這個設定,但要記住的是,即使你的機器是乙個輕載的web 伺服器,也有因為大量的死套接字而記憶體溢位的風險,fin- wait-2 的危險性比fin-wait-1 要小,因為它最多只能吃掉1.5k 記憶體,但是它們的生存期長些。

net.ipv4.tcp_keepalive_time = 30

當keepalive 起用的時候,tcp 傳送keepalive 訊息的頻度。預設是2 小時。

比如nginx,最好根據cpu的執行緒數去配置worker;要開啟epoll模式,要開啟sendfile等等就不說了。

linux伺服器調整引數支援高併發

服務端調整系統的引數,在 etc sysctl.conf中 net.core.somaxconn 2048 net.core.rmem default 262144 net.core.wmem default 262144 net.core.rmem max 16777216 net.core.wm...

高併發Linux伺服器的常用配置

檢視linux系統級的最大開啟檔案數限制 cat proc sys fs file max linux系統級硬限制,所有使用者級的開啟檔案數限制都不應超過這個數值 修改使用者程序可開啟檔案數限制 fs.file max 999999 程序可以同時開啟的最大控制代碼數 允許將time wait soc...

Linux高併發伺服器解決方案

linux高併發伺服器案例演示 在網路通訊中,我們常常的伺服器經常會受到成千上萬的請求提示,而電腦會根據請求建立相對應的socket鏈結,但是接觸過linux網路程式設計的人都知道,linux鏈結和客戶端建立連線,會經過四步 這裡以tcp說明 第一步,建立socket對應的描述符,這裡設定好sock...