Linux

64bit 上的 LAMP 堆棧,16 核機箱消耗 100% CPU

  • May 20, 2011

===已解決===

這個問題解決了。事實證明 ImageMagick 在多個 CPU 上存在問題。編譯 ImageMagick 以使用一個 CPU 解決了這個問題。

================

我添加了一個新的 Web 伺服器作為升級,但它在幾秒鐘內就崩潰了。

舊盒子有 8 個 2.33GHz 的 Xeon 核心。新機擁有 16 個 2.40GHz 的 Xeon 核心。新機記憶體分別為8G和32G。

另一個主要區別是從 32 位到 64 位的飛躍。

作業系統都是 CentOS 5.6,Apache 也是 2.2.3-45。

PHP 是 5.2.10 並且是手工編譯的。除了架構位之外,配置選項是相同的。

從所有這些資訊中,您會認為新機器會尖叫,但目前的盒子會處理負載並且偶爾會摔倒。新機器每次都在不到一分鐘的時間內當機。

記憶體很好,I/O 很好,但 CPU 很難固定。這是來自兩者的 mpstat 的輸出

舊盒子

09:14:18 PM  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
09:14:20 PM  all   31.34    0.00    2.62    9.68    0.12    1.00    0.00   55.24  11163.50
09:14:20 PM    0   53.00    0.00    5.50   16.00    0.50    6.50    0.00   18.50  10249.50
09:14:20 PM    1   36.68    0.00    2.51   11.06    0.00    0.00    0.00   49.75    126.00
09:14:20 PM    2   17.41    0.00    1.99    7.96    0.00    0.00    0.00   72.64    125.50
09:14:20 PM    3   41.00    0.00    3.00    9.00    0.00    0.00    0.00   47.00    125.50
09:14:20 PM    4   30.00    0.00    2.00    7.50    0.00    0.50    0.00   60.00    143.00
09:14:20 PM    5   28.50    0.00    2.00   12.00    0.00    0.00    0.00   57.50    142.50
09:14:20 PM    6   22.61    0.00    1.51    7.54    0.00    0.00    0.00   68.34    125.50
09:14:20 PM    7   21.50    0.00    2.50    6.50    0.00    0.00    0.00   69.50    125.50

新盒子

09:13:41 PM  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
09:13:43 PM  all   98.69    0.00    0.81    0.00    0.03    0.47    0.00    0.00   4723.50
09:13:43 PM    0  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   1000.50
09:13:43 PM    1  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00      0.00
09:13:43 PM    2  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00      0.00
09:13:43 PM    3  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00      0.00
09:13:43 PM    4   98.01    0.00    1.49    0.00    0.00    0.50    0.00    0.00      0.00
09:13:43 PM    5  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00      0.00
09:13:43 PM    6  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00      0.00
09:13:43 PM    7   98.51    0.00    1.49    0.00    0.00    0.00    0.00    0.00      0.00
09:13:43 PM    8  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00      0.00
09:13:43 PM    9   99.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00      0.00
09:13:43 PM   10  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00      0.00
09:13:43 PM   11  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00      0.00
09:13:43 PM   12   95.50    0.00    4.00    0.00    0.00    0.50    0.00    0.00     84.50
09:13:43 PM   13  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00      0.00
09:13:43 PM   14  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00      0.00
09:13:43 PM   15   87.56    0.00    4.98    0.00    0.50    6.97    0.00    0.00    3640.0  

流量通過負載均衡器進入,並在兩者之間以 50/50 的比例分配。當我打開新機器時,負載峰值達到 200,我必須將其關閉,因為它停止接收請求。

針對 httpd 的 strace 似乎沒有什麼啟示,但這是 strace -c -f -p 的輸出

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
73.52    2.763912         419      6594      1663 futex
 8.65    0.325110          55      5869      4099 open
 5.35    0.201250         107      1873       381 stat
 3.12    0.117305          67      1748       165 lstat
 2.30    0.086434        2010        43           wait4
 1.64    0.061543           7      8825       769 read
 1.31    0.049158         125       394           clone
 0.77    0.028874          53       543           chdir
 0.75    0.028356          29       973           munmap
 0.34    0.012783          35       370           times
 0.30    0.011298         257        44           madvise
 0.24    0.008897           7      1312           fstat
 0.22    0.008225           1      9341         2 poll
 0.18    0.006682           2      2777        14 write
 0.14    0.005358           5      1184           mmap
 0.13    0.005020          19       262           set_robust_list
 0.13    0.004990           3      1688        30 writev
 0.13    0.004799           7       671       598 access
 0.08    0.003194           0      6531           recvfrom
 0.06    0.002404           4       673         8 sendto
 0.06    0.002398           4       578           getcwd
 0.06    0.002367           5       491           mprotect
 0.05    0.002013           4       457           brk
 0.05    0.001965           2       883           semop
 0.05    0.001924           3       760           lseek
 0.04    0.001622           2       845           setitimer
 0.04    0.001525           4       412           epoll_wait
 0.04    0.001486           1      2595           close
 0.04    0.001430           3       412           accept
 0.04    0.001429           3       433       231 connect
 0.04    0.001388           1      1185           rt_sigaction
 0.03    0.000999           2       594           rt_sigprocmask
 0.03    0.000963           0      2325           fcntl
 0.02    0.000935           1       690           setsockopt
 0.01    0.000393           1       534           socket
 0.01    0.000380           1       393        12 shutdown
 0.00    0.000158           1       127           setuid
 0.00    0.000156           0       411           getsockname
 0.00    0.000156           2        70        46 unlink
 0.00    0.000080           0       254           epoll_ctl
 0.00    0.000000           0        64           ioctl
 0.00    0.000000           0        38         6 select
 0.00    0.000000           0        10           alarm
 0.00    0.000000           0       230           getsockopt
 0.00    0.000000           0         3           rename
 0.00    0.000000           0        22           getrusage
 0.00    0.000000           0       127           setgid
 0.00    0.000000           0       254           geteuid
 0.00    0.000000           0       127           setgroups
 0.00    0.000000           0       127           epoll_create
------ ----------- ----------- --------- --------- ----------------
100.00    3.759359                 67166      8024 total

========== 編輯/更新 ==========

我發現當我按照建議將負載均衡器上的流量限制為 10% 時,它仍然崩潰。當我用 siege 和 400 連接擊敗它時,它的表現非常好。負載增加但徘徊在 6 左右並滿足所有請求。

我禁用了訪問日誌,但我啟用了一段時間並告訴負載均衡器再次開始發送流量。我讓它執行直到負載達到 200 大約 3 分鐘並保存了日誌。

我解析了日誌以獲取與圍攻一起使用的請求。這會給我一個更準確的基準。

果然,沒有實時數據,只有我點擊它,我將負載飆升到 200。我開始將文件切成兩半並測試上半部分和下半部分。我將繼續此操作,直到找到破壞伺服器的特定請求或請求。

到目前為止,它看起來像是大量使用 ImageMagick 的東西,但我已經將 10K GET 請求減少到 50 個並且仍在繼續。

這不是一個答案,而是一系列幫助您追踪它的步驟。

  1. 安裝 Ganglia: http: //ganglia.sourceforge.net/。它是我首選的負載故障排除工具。你會喜歡它。
  2. 看看您是否可以使用負載均衡器將較小百分比的流量(例如 5%)發送到您的新伺服器。這將使您的伺服器有希望保持更長時間。
  3. 在新伺服器上執行 top 並通過“P”排序鍵按 CPU 排序。看看是什麼佔用了大部分週期。
  4. 仔細檢查所有與 MySQL 和 Apache 的 PHP 綁定以及庫是否安裝正確。根據您迄今為止提供的資訊,這是我對出了什麼問題的第一個懷疑。您手動編譯 PHP 的事實也引發了潛在的危險信號。仔細檢查您的配置選項,並確保在 32/64 位更改中預期或要求的內容沒有任何變化。
  5. 啟用並查看日誌:php error_log 和 apache 錯誤日誌以查看發生了什麼。這總是提供資訊,但您需要在特定環境中將信號與雜訊分開。

這些步驟中的一個或多個可能有助於充實問題所在。

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