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和後台進行互動大部分用的...