网站加载缓慢、内存占用高

网站加载缓慢、内存占用高

我的网站最近几天速度变慢了……有些图片没有显示……我得到了

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

发生了几次以前从未发生过的情况。

我做了一些性能检查,基本上是 ssh 中的 top 命令

这是结果

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

答案1

通常是 .htaccess 文件重新注入了更改的请求 URI,请检查一下,也可以重置配置文件

答案2

您的问题描述是 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 慢速日志(如果未启用,请启用它)。

  • 检查您的错误日志 - 可能存在一些应用程序超时或其他错误。

  • 如果您运气不佳,您还可以pstack ${PID}定期运行以尝试了解 httpd 正在做什么。

  • 最后,您可以使用 tcpdump 和 Wireshark 之类的工具来隔离速度变慢的位置,尽管这有点繁琐。我认为还有一个 httpd 模块可以细分请求中的时间,但我现在找不到它,在内置模块列表中也没有看到它。

答案3

您的内存使用率并不高,您应该跳过故障排除的这一部分并尝试 Inforfinity 所建议的操作。

Linux 内核倾向于占用可用的未使用内存进行磁盘缓存。它使系统运行得更快。如果任何应用程序需要内存,它将从缓存本身获取。所以基本上你并不缺内存。考虑 free -m 的输出

-/+ 缓冲区/缓存:4516 27553

实际使用 RAM 为 4516MB,实际可用内存为 27553。缓存接近 17G。

尝试对您的 Web 服务器进行性能测试。使用 httperf 进行基准测试。

httperf --server yoursite.com --port 80 --num-conns 100 --rate 10

相关内容