/ Work

[Apache tech.] 工作筆記,關於那些錯誤

[Tue Dec 16 12:07:16 2008] [notice] Apache/2.2.6 (FreeBSD) mod_ssl/2.2.6 OpenSSL/0.9.7e-p1 DAV/2 PHP/5.2.5 with Suhosin-Patch configured -- resuming normal operations
[Tue Dec 16 12:07:20 2008] [notice] child pid 67644 exit signal Segmentation fault (11)
[Tue Dec 16 12:07:20 2008] [notice] child pid 67643 exit signal Segmentation fault (11)
[Tue Dec 16 12:07:34 2008] [notice] child pid 67642 exit signal Segmentation fault (11)
[Tue Dec 16 12:12:49 2008] [notice] child pid 67646 exit signal Segmentation fault (11)
[Tue Dec 16 12:33:19 2008] [notice] child pid 67715 exit signal Segmentation fault (11)
[Tue Dec 16 12:35:12 2008] [notice] child pid 67781 exit signal Segmentation fault (11)
[Tue Dec 16 12:35:27 2008] [notice] child pid 67777 exit signal Segmentation fault (11)
[Tue Dec 16 12:47:10 2008] [notice] child pid 67791 exit signal Segmentation fault (11)
[Tue Dec 16 12:48:35 2008] [notice] child pid 67815 exit signal Segmentation fault (11)
[Tue Dec 16 12:49:01 2008] [notice] child pid 67814 exit signal Segmentation fault (11)
[Tue Dec 16 12:50:26 2008] [notice] child pid 67816 exit signal Segmentation fault (11)
[Tue Dec 16 12:51:59 2008] [notice] child pid 67817 exit signal Segmentation fault (11)
[Tue Dec 16 12:53:40 2008] [notice] child pid 67822 exit signal Segmentation fault (11)
[Tue Dec 16 13:00:22 2008] [notice] child pid 67840 exit signal Segmentation fault (11)
[Tue Dec 16 13:08:48 2008] [notice] child pid 67821 exit signal Segmentation fault (11)
[Tue Dec 16 13:09:39 2008] [notice] child pid 67872 exit signal Segmentation fault (11)
[Tue Dec 16 13:11:46 2008] [notice] child pid 67823 exit signal Segmentation fault (11)

這個問題三不五時再發生,問了 Google 大神也問不出個所以然來。就算是使用錯誤追蹤也追不到什麼結果。後來索性針對 mpm_worker_module 這個設定來做測試。結果發現在 MaxClientsMaxSpareThreads 之間的一些微妙關係。

    StartServers             5
    MaxClients            1984
    ServerLimit             32
    MinSpareThreads         50
    MaxSpareThreads       1984
    ThreadsPerChild         64

只要把 MaxSpareThreadsMaxClients 設定成相同的數值,這個問題就自動消失了。這真的很奇妙,老實說我也不知道為什麼。這些設定值在 Apache 的官方網站上都找得到解釋與互相的關係,但是就是不知道為什麼這樣可以使用。

個人猜測,在每一個進程開啟之後,最高線程數量達到 Max 時會開啟新的進程,那麼,當最高線程量設定數目較低時,我之前是設定 250,可能會產生同一個連線 (IP) 進來所引發的併發連線,在不同的 Server (不同的 httpd 上),會有線程之間的問題,至於是什麼問題我也不清楚。

總之,線程量加大確實可以避免這樣的錯誤問題,只是也不可能無上限的加大,這樣只會讓主機的效能不增反降而已。我在 Google 上有找到這種說法,或許可以參考參考吧。

資料來源:http://tec.serveblog.net/?p=335

在設置的活動子進程數量之外,
還可能有額外的子進程處於 ”正在中止” 的狀態,
但是其中至少有一個服務線程仍然在處理客戶端請求,
直到到達 MaxClients 以致結束進程,雖然實際數量會很小。
這個行為能夠通過以下禁止特別的子進程中止的方法來避免:

  • MaxRequestsPerChild 設為 ”0″
  • MaxSpareThreadsMaxClients 設為相同的值
  • MaxRequestsPerChild 指令用於控制服務器建立新進程和結束舊進程的頻率。