一个少妇满足三个老头在线观看,锕锕锕锕锕锕锕好痛视频,亚洲人成网站在线播放2019

<center id="pt2l2"></center>
<tr id="pt2l2"></tr>
  • <big id="pt2l2"></big>

        centos服務器調優 這個 TCP 問題你得懂:Cannot assign requested address

        微信群里一陣騷動,響聲震天。

        我心想,雖然是周五,并且到了下班點,但也不至于這么興奮吧。

        打開微信一看,心涼半截,全是報系統 403 錯誤的消息。別說下班了,怕是老板會讓我永遠下班吧。

        別慌,在長期的團隊協作訓練中,我明白了一個道理:穩住我們能贏。

        冷靜下來之后,我仔細分析了一下問題的原因。

        403 說明權限不足,也就是說我們的子系統到鑒權中心拉取權限失敗了。直接登錄到子系統服務器,手動執行拉取權限程序,的確是拉不到。

        我的推測沒有問題,難道網絡不通了?telnet 目標端口試試,然后 Linux 給我返回了這個錯誤信息:

        Cannot assign requested address

        原因

        產生這個錯誤的原因是由于 Linux 分配的客戶端連接端口用盡,無法建立 socket 連接導致的。

        我們都知道,建立一個連接需要四個部分:目標 IP,目標端口,客戶端 IP 和客戶端端口。其中前三項是不變的,只有客戶端端口不斷變化。

        那么在大量頻繁建立連接時,而端口又不是立即釋放,默認是 60s,就會出現客戶端端口不夠用的情況。

        這就是這個問題的本質。

        接下來使用兩個命令來驗證一下:

        查看連接數:

        # netstat -ae | wc -l
        # netstat -ae | grep TIME_WAIT | wc -l

        查看可用端口范圍:

        # sysctl -a | grep port_range
        net.ipv4.ip_local_port_range = 50000    65000

        結果就是連接數是遠大于可用端口數的。

        解決

        怎么解決呢?有兩個方案:

        1. 調低 TIME_WAIT 時間

        2. 調高可用端口范圍

        調低 TIME_WAIT 時間(不推薦)

        編輯內核文件 /etc/sysctl.conf,增加以下內容:

        // 表示開啟 SYN Cookies。當出現 SYN 等待隊列溢出時,啟用 cookies 來處理,
        // 可防范少量 SYN 攻擊,默認為 0,表示關閉;
        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 
        // 修改系統默認的 TIMEOUT 時間,默認為 60s
        net.ipv4.tcp_fin_timeout = 30

        調高可用端口范圍(推薦)

        編輯內核文件 /etc/sysctl.conf,增加以下內容:

        // 表示用于向外連接的端口范圍。設置為 1024 到 65535。
        net.ipv4.ip_local_port_range = 1024 65535

        最后,執行 sysctl -p 使參數生效。

        復盤

        我通過增加可用端口范圍,順利將問題解決,看來可以正常下班了。

        但是還沒完,為什么會突然有這么多連接呢?通過分析日志發現,過去一段時間,我的一個同事瘋狂請求系統接口,應該就是這個操作引起的,問了一下原來是在爬數據。好家伙直接來硬的,找我提供一個 API 不香嗎?

        不過這也反應了我們的系統也太過脆弱,一個小爬蟲就給搞掛了。分析了線上代碼,覺得有三個地方應該優化:

        1. 每次請求鑒權中心不應該都建立新的連接,而是應該復用之前的連接,比如單例模式;

        2. 權限相對來說是變化不頻繁的,子系統應該建立本地緩存,而不是每次實時請求;

        3. 不止要對 POST 接口設置頻率限制,GET 接口也應該限制。

        剩下的事就是優化代碼了,不過,先開心的過個周末再說。



        若文章對您有幫助,幫忙點個贊!

        0
        0
        發布時間 2022-09-23 00:43:40
        0 條回復(回復會通過微信通知作者)
        點擊加載更多評論
        登錄 后再進行評論
        (微信掃碼即可登錄,無需注冊)
        一个少妇满足三个老头在线观看,锕锕锕锕锕锕锕好痛视频,亚洲人成网站在线播放2019