Debian
API 和 elasticsearch 伺服器之間每 2 小時超時一次
我們的伺服器上遇到了一個奇怪的問題。(Debian 8.9) 我們有一個 API,它是一個 PHP 應用程序。它請求彈性搜尋,哪個實例在單獨的伺服器上。
每 2 小時,我們就會遇到錯誤 500,它會持續 1 或 2 分鐘,很少超過:
[2017-10-19 20:52:10] +2 hours [2017-10-19 22:51:59] +2 hours [2017-10-20 00:52:02] +2 hours [2017-10-20 02:52:14] +2 hours [2017-10-20 04:52:28] +2 hours
有時是+4 小時或+6。
以下是錯誤的詳細資訊:
request.CRITICAL: Uncaught PHP Exception Elastica\Exception\Connection\HttpException: "Operation timed out"
這很清楚。API 會嘗試連接到 elasticsearch 實例,直到達到 http 客戶端的指定超時時間。
什麼可能導致這種情況?如何調試此類問題?
當然,稍後檢查所有 URL 的引用者時,一切正常。
他們終於設法找到了問題所在。根本原因是完全愚蠢的。事實上,es 集群的監控視圖向 es 發送了很多查詢。大約是應用程序本身的 6 倍!
正如您每 2 小時看到的那樣,記憶體太高,伺服器在幾分鐘內不可用,直到它清除記憶體(垃圾收集器)。
其他參數也被優化和/或增加。
我建議在核心中提高 somaxconn 參數。
添加到
/etc/sysctl.conf
:net.core.somaxconn=512
然後執行:
sudo sysctl -p
同樣在
/etc/redis.conf
raisetcp-backlog
中(或更多):tcp-backlog 512
從 redis 配置文件:
TCP 偵聽()積壓。
在每秒請求數較高的環境中,您需要大量積壓,以避免客戶端連接緩慢的問題。請注意,Linux 核心會默默地將其截斷為 /proc/sys/net/core/somaxconn 的值,因此請確保同時提高 somaxconn 和 tcp_max_syn_backlog 的值以獲得所需的效果。