每天進步一點點 Swift之作業系統效能優化

2021-06-20 19:07:35 字數 3467 閱讀 2620

swift是基於restful設計的分布式物件儲存系統,其工作原理類似於乙個web伺服器。當上層大量的訪問或者上傳資料時其會產生大量的http鏈結,每乙個鏈結

都會消耗掉乙個系統的埠(系統中預設最多有65536個埠,因此埠對作業系統來說是乙個緊俏的稀缺資源),直到該鏈結斷開且被系統**後才能

重複使用,如果所有埠都已被占用,那麼新來的http鏈結就得等到有埠可以使用方能正常工作,這樣就大大的拉公升了請求的響應時間,從而導致系統

資源的使用率降低。如果長時間不能得到可用的埠(swift中proxy向account/container/object服務發起http連線預設等待時間是0.5秒,也就是說0.5秒之後,

該鏈結如果還無法連上,則將會返回503給上層應用。在高壓力之下,如果埠釋放已被耗盡且不能及時的釋放的話,這種情況是常會發生的)

在http鏈結斷開後,作業系統並不會立即**對應的埠

構建高效穩定的swift執行環境

在swift接受大量請求之後作業系統會產生大量處於tcp time_wait狀態的連線不能快速的**,從而導致系統的埠不能及時的被利用,後來的請求被阻塞無法等到及時的響應,最終導致系統處於有可能被拉死的危險情形。

根據swift官方建議以及長時間使用swift的經驗,希望作業系統對/etc/sysctl.conf檔案新增如下配置(如果/etc/sysctl.conf檔案中已有和如下配置相同

的則可以不用更改,或者改為如下值)

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_max_syn_backlog = 32768

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.ip_local_port_range = 10240 65000

net.core.netdev_max_backlog = 3000

net.core.somaxconn = 10240

增加或者修改完儲存之後使用命令sysclt -p來使其及時生效,同時也可以檢測是否書寫正確

注釋:#1表示開啟syn cookies。當出現syn等待佇列溢位時,啟用cookies來處理,可防範少量syn攻擊,預設為0,表示關閉

#開啟有助於保護伺服器免受syncflood攻擊

net.ipv4.tcp_syncookies = 1 

#表示syn佇列的長度,預設為1024,加大佇列長度為32768,可以容納更多等待連線的網路連線數。

net.ipv4.tcp_max_syn_backlog = 32768

#1表示開啟重用。允許將time-wait sockets重新用於新的tcp連線,預設為0,表示關閉 。開啟該選項對web伺服器來說非常有用,

#能夠減少由於大量time-wait造成的系統壓力

net.ipv4.tcp_tw_reuse = 1

#1表示開啟tcp連線中time-wait sockets的快速**,預設為0,表示關閉 。與net.ipv4.tcp_tw_reuse類似

net.ipv4.tcp_tw_recycle = 1

#表示用於向外連線的埠範圍。預設情況下很小:32768到61000,改為10240到65000 增加系統埠的隨機可用個數,減少等待時間

net.ipv4.ip_local_port_range = 10240 65000

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

net.core.netdev_max_backlog = 3000

#系統socket操作中listen 函式的backlog的最大值,預設128 。當server處理請求較慢,以至於監聽佇列被填滿後,新來的請求會被拒絕。

#在swift壓力過大時128是遠遠不夠的

net.core.somaxconn = 10240

/etc/sysctl.conf

#表示當keepalive起用的時候,tcp傳送keepalive訊息的頻度。預設是2小時,改為1800秒,

#減少tcp keepalive連線偵測的時間,使系統可以處理更多的連線

net.ipv4.tcp_keepalive_time = 1800

net.ipv4.tcp_orphan_retries = 3

#表示如果套接字由本端要求關閉,這個引數決定了它保持在fin-wait-2狀態的時間

#net.ipv4.tcp_fin_timeout = 30  

#表示syn佇列的長度,預設為1024,加大佇列長度為32768,可以容納更多等待連線的網路連線數。

net.ipv4.tcp_max_syn_backlog = 32768

#表示開啟syn cookies。當出現syn等待佇列溢位時,啟用cookies來處理,可防範少量syn攻擊,預設為0,表示關閉

#開啟有助於保護伺服器免受syncflood攻擊

net.ipv4.tcp_syncookies = 1

#表示開啟重用。允許將time-wait sockets重新用於新的tcp連線,預設為0,表示關閉

net.ipv4.tcp_tw_reuse = 1

#表示開啟tcp連線中time-wait sockets的快速**,預設為0,表示關閉

net.ipv4.tcp_tw_recycle = 1

#表示用於向外連線的埠範圍。預設情況下很小:32768到61000,改為20480到65000

net.ipv4.ip_local_port_range = 20480 65000

#減少超時前的探測次數 

net.ipv4.tcp_keepalive_probes = 5

#優化tcp接收/傳送緩衝區

net.ipv4.tcp_rmem = 4096 87380 16777216

net.ipv4.tcp_wmem = 4096 65536 16777216

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

net.core.netdev_max_backlog = 3000

#該檔案表示每個套接字所允許的最大緩衝區的大小

net.core.optmem_max = 81920

#該檔案指定了傳送套接字緩衝區大小的預設值(以位元組為單位)

net.core.wmem_default = 8388608

#指定了傳送套接字緩衝區大小的最大值(以位元組為單位)

net.core.wmem_max = 16777216

#指定了接收套接字緩衝區大小的預設值(以位元組為單位)

net.core.rmem_default = 8388608

#指定了接收套接字緩衝區大小的最大值(以位元組為單位)

net.core.rmem_max = 16777216

#web 應用中listen 函式的backlog缺省會給核心引數的net.core.somaxconn限制到128

net.core.somaxconn = 20480

每天進步一點點

很多朋友總喜歡問 成功靠什麼?其實,成功很難單一的歸納為靠什麼條件,如果一定要回答,只能從某種意義上說 很多人的成功就是靠他們每天比別人 多做一點點 正如古人有云 業精於勤,荒於嬉。這裡所說的勤,也就是比別人多做一點點,即付出多一點的勞動和努力。不要小看這一點點,又如古語說 集腋成裘,積沙成丘。如果...

每天進步一點點

在模組化程式設計時,在子模組中宣告變數 例如unsigned char aa 不需要在標頭檔案中宣告 要在主函式中呼叫,要寫成 extern unsigned char aa 而不能寫成 extern aa 寫成extern aa 則無法改變aa的值。2014年9月22日 21 12 00 品質因數...

每天進步一點點(一)

最近接了第乙個商業專案,一人獨立完成從前台到後台,做了有幾天的時間,每天進步一點點,把每天看到的學到的記錄下來,以後也堅持。後台繼續用自己的extjs老本行,因為相比其他js庫,extjs用的比較熟,現成的 也有所以開發起來也比較容易,今天學到了兩個ext的新東西。一 ext和後台進行互動大部分用的...