Apache-2.2

MongoDB 副本集成員上異常大量的 httpd 程序和高 CPU 負載

  • February 13, 2016

我正在調查 3 台用作 MongoDB 副本集的 CentOS 機器上的奇怪行為,而其中一台還託管一個使用 MongoDB 副本集的 PHP Web 應用程序。基本設置如下:

  • 節點 1:CentOS 5.8、MongoDB 2.6.10(充當 PRIMARY)、Apache 2.2.23(使用 MongoDB 驅動程序 1.6.10 執行 PHP Web 應用程序)
  • 節點 2:CentOS 5.11、MongoDB 2.6.10(充當 SECONDARY)、Apache 2.2.23(只執行一個空 index.html,由 Nagios 每隔幾分鐘呼叫一次)
  • 節點 3:CentOS 5.11、MongoDB 2.6.10(充當 SECONDARY)、Apache 2.2.23(只執行一個空 index.html,由 Nagios 每隔幾分鐘呼叫一次)

現在,他們都經歷了幾乎恆定的 100% CPU 負載。負載是由大量 httpd 程序啟動造成的。即使在幾乎沒有 HTTP 流量的節點 2 和 3 上。mongod 程序的 CPU 使用率在每台機器上都非常小。

這是top節點 2 上的輸出:

在此處輸入圖像描述

節點 1 和 3 上的輸出看起來非常相似。這是節點 2 上的 httpd 訪問日誌的樣子:

在此處輸入圖像描述

擁有大量 httpd 程序但實際 HTTP 請求數量非常少對我來說似乎很奇怪。當我檢查netstat -p節點 2 時,我看到如下內容:

在此處輸入圖像描述

打開的 mongod 套接字應該是複制工作人員或副本集心跳,但netstat -p輸出中真正引人注目的是:來自對應方(節點 3)上的 MongoDB 埠 27017 的打開的 httpd(?!)套接字的額外數量。

因此,登錄到機器(例如通過 SSH)會在一段時間後變得非常緩慢。重啟httpd短期內有效,httpd程序數和CPU負載瞬間下降到正常水平。但幾個小時後,httpd 程序/套接字再次填滿,機器又恢復了 100% 的 CPU 負載。重啟 httpd 對副本集的執行沒有任何影響。

我不確定,但我猜 Apache 的 prefork/worker 配置沒什麼特別的:

<IfModule prefork.c>
   StartServers       8
   MinSpareServers    5
   MaxSpareServers   20
   ServerLimit      256
   MaxClients       256
   MaxRequestsPerChild  4000
</IfModule>

<IfModule worker.c>
   StartServers         2
   MaxClients         150
   MinSpareThreads     25
   MaxSpareThreads     75 
   ThreadsPerChild     25
   MaxRequestsPerChild  0
</IfModule>

長話短說……

  • 真的是 MongoDB 副本集,它以某種方式影響了 Web 伺服器,為什麼?
  • 為什麼 Apache (httpd) 甚至關心這些隨機 37000 ~ 60999 埠上的套接字?(它不應該只處理埠 80/443 嗎?)
  • 我能做些什麼來解決或至少隔離問題?

事實證明,Apache文件夾中舊的和損壞的 SSL 配置(VirtualHost與不同的過期證書重複)以某種方式導致了大量的 httpd 程序、打開的連接和隨之而來的高 CPU 負載。conf.d

由於根本沒有錯誤消息,我對配置進行了三次檢查並進行了一些試錯嘗試。刪除 SSL 配置導致已啟動的 httpd 程序顯著下降,並且連接保持打開狀態。CPU 負載下降到正常水平。

問題解決了,不管這個奇怪的現像是從哪裡來的,以及損壞的 SSL 配置與它有什麼關係。儘管如此,我仍然想知道 MongoDB 副本集成員和 httpd 套接字的奇怪關係仍然出現在netstat -p.

引用自:https://serverfault.com/questions/754343