Apache-2.2

緩慢的網站載入和高記憶體使用

  • October 2, 2013

最近幾天我的網站速度變慢了…有些圖像沒有顯示…我知道了

408 Request Time-out: Server timeout waiting for the HTTP request from the client 

以前從未發生過的幾次。

我做了一些性能檢查,基本上是 ssh 中的頂級命令

這是結果

http://up.akstube.com/images/vdtebe9sr10si1eyycd.jpg

如您所見,記憶體使用率非常高……或者我認為是。

我已經重新啟動了伺服器……它下降了,但之後它又上升了……(這是重新啟動後大約一個小時)

http://up.akstube.com/images/49xjeylxy0st7vwn4ojl.png

半小時後=>

   top - 16:14:22 up  1:56,  2 users,  load average: 0.62, 0.90, 1.15
   Tasks: 303 total,   1 running, 302 sleeping,   0 stopped,   0 zombie
   Cpu(s):  8.0%us,  0.2%sy,  0.0%ni, 91.4%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st
   Mem:  32840004k total, 21037648k used, 11802356k free,   430832k buffers
   Swap:  1050616k total,        0k used,  1050616k free, 16527108k cached

現在

[root@ns4008353 ~]# top
top - 16:33:25 up  2:15,  2 users,  load average: 0.88, 0.94, 0.98
Tasks: 303 total,   3 running, 300 sleeping,   0 stopped,   0 zombie
Cpu(s):  6.8%us,  0.2%sy,  0.0%ni, 92.8%id,  0.0%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:  32840004k total, 22388160k used, 10451844k free,   434964k buffers
Swap:  1050616k total,        0k used,  1050616k free, 17324104k cached

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
7532 mysql     20   0 3750m 492m 5556 S 18.0  1.5  49:53.58 mysqld
12903 apache    20   0  232m  40m 4864 S 16.3  0.1   0:56.74 httpd
7748 apache    20   0  235m  43m 5256 S 11.6  0.1   1:33.36 httpd
8010 apache    20   0  262m  70m 4856 R  6.7  0.2   1:32.05 httpd
7747 apache    20   0  235m  43m 5220 S  1.3  0.1   1:06.37 httpd
7749 apache    20   0  222m  30m 5164 S  1.3  0.1   1:58.53 httpd
7996 apache    20   0  250m  59m 5476 S  1.3  0.2   1:37.37 httpd
  10 root      20   0     0    0    0 S  0.3  0.0   0:09.72 rcu_sched
7714 apache    20   0  265m  73m 4972 S  0.3  0.2   1:34.53 httpd
7905 named     20   0  669m  24m 3020 S  0.3  0.1   0:02.01 named
7999 apache    20   0  232m  40m 4968 S  0.3  0.1   1:17.67 httpd
20865 root      20   0     0    0    0 S  0.3  0.0   0:01.05 kworker/2:2
21491 root      20   0 15212 1308  852 S  0.3  0.0   0:01.38 top
23810 root      20   0 15212 1340  852 R  0.3  0.0   0:00.07 top
   1 root      20   0 19404 1568 1268 S  0.0  0.0   0:00.58 init
   2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd

免費米

[root@ns4008353 ~]# free -m
            total       used       free     shared    buffers     cached
Mem:         32070      21897      10173          0        424      16955
-/+ buffers/cache:       4516      27553
Swap:         1025          0       1025

您認為這是響應緩慢的原因嗎?是否有任何評論以獲取有關使用記憶體的更多資訊?


我有一個專用伺服器:

Processor Name  Intel(R) Xeon(R) CPU E3-1245 V2 @ 3.40GHz
Vendor ID   GenuineIntel
Processor Speed (MHz)   1600.000
Total Memory    32840004 kB
Free Memory 10416752 kB
Total Swap Memory   1050616 kB
Free Swap Memory    1050616 kB
System Uptime   0 Days, 2 Hours and 22 Minutes
Apache 2.2.24   Running
DirectAdmin 1.43.0  Running
Exim 4.76   Running
MySQL 5.5.31    Running
Named 9.8.2rc1  Running
ProFTPd 1.3.4d  Running
sshd    Running
dovecot 2.2.4   Running

已安裝 PHP 5.3.26

查看我的日誌文件後,我看到了很多這個錯誤

[Sat Sep 28 00:15:41 2013] [error] [client 66.249.73.162] Request exceeded the limit of 10 internal redirects due to probable co
nfiguration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace

它通常是重新註入更改的請求 URI 的 .htaccess 文件,檢查一下,您也可以重置配置文件

您的問題描述是緩慢的 HTTP 請求,但正如您所展示的,CPU 和記憶體並未耗盡。所以有幾件事要檢查:

  • 確保請求確實很慢。在 httpd.conf 中,找到這一行:

LogFormat “%h %l %u %t "%r" %>s %b” 常見

並在 %b 之後添加 %D (但在結束引號內)。見http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

然後重新載入/重新啟動 httpd,您的 access_log 文件現在應該在最後一列中顯示每個響應所需的時間(以微秒為單位)。確認這些很慢。也許只有某些類型的請求很慢?我注意到 MySQL 正在使用一些 CPU,所以也許一種類型的請求會遇到緩慢的數據庫查詢?

  • 如果上面的響應確實很慢並且沒有明顯的模式(例如特定頁面),那麼您需要確定它們慢的地方。%D 時間包括一切,從讀取來自客戶端的請求、提供文件(包括任何應用程式碼或數據庫查詢)和寫入響應,所以它只是告訴您減速,不一定是在哪裡。所以現在你需要找出減速的地方。我會先檢查應用程序。還要檢查 MySQL 慢日誌(如果未啟用,請啟用它)。
  • 檢查您的 error_log - 可能有一些應用程序超時或其他錯誤。
  • 如果您沒有任何運氣,您也可以pstack ${PID}定期執行以嘗試了解 httpd 在做什麼。
  • 最後,您可以使用 tcpdump 和 Wireshark 之類的東西來隔離減速的位置,儘管這會有點乏味。我認為還有一個 httpd 模組可以分解請求中的時間,但我現在找不到它,也沒有在內置模組列表中看到它。

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