我租用了一台基于 CentOS 的虚拟服务器,上面运行着大约 5 个活跃网站。几个月前,我注意到我的网站运行性能明显下降。
第一个症状是 HTTP 服务器停止响应后,运行的 apache 进程太多(约 300 个)。重启后问题消失,但一天或一周后又会偶尔出现。我尝试了 httpd.config 选项,但无法摆脱该问题,我找到的唯一解决方案是每隔 1 小时安排服务器重启一次。重启速度很快,所以是暂时的,它解决了问题。
然而几个月前我开始观察到服务器性能的另一个问题 - 网站周期性地响应太慢。
我需要一些建议或帮助来找出问题的根源,因为我目前不确定我是否理解它:
看起来内存足够了,下面是从顶部输出的:内存:总计 524288k,已使用 299252k,可用 225036k,缓冲区 0k
磁盘空间足够(来自“vm -h”):
Filesystem Size Used Avail Use% Mounted on
vzfs 40G 28G 13G 70% /
none 3.9G 4.0K 3.9G 1% /dev
以下是来自“vmstat -SM 2 100”的有关资源使用情况的运行时信息:
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 220 0 0 0 0 8 111 0 1 6 4 90 0 0
0 0 0 220 0 0 0 0 0 0 0 272 0 0 100 0 0
0 0 0 220 0 0 0 0 0 0 0 176 0 0 100 0 0
0 0 0 220 0 0 0 0 0 0 0 132 0 0 100 0 0
0 0 0 220 0 0 0 0 0 1950 0 330 0 0 100 0 0
2 0 0 220 0 0 0 0 0 4 0 1854 21 19 60 0 0
2 0 0 210 0 0 0 0 0 4 0 1958 73 23 4 0 0
2 0 0 199 0 0 0 0 0 4 0 829 41 40 19 0 0
1 0 0 207 0 0 0 0 0 26 0 1212 47 17 36 0 0
1 0 0 206 0 0 0 0 0 4 0 1405 50 4 45 0 0
0 0 0 209 0 0 0 0 4 140 0 1251 34 5 60 0 0
0 0 0 208 0 0 0 0 0 0 0 213 1 0 99 0 0
0 0 0 208 0 0 0 0 0 0 0 353 0 0 100 0 0
0 0 0 208 0 0 0 0 0 6 0 317 0 0 100 0 0
0 0 0 206 0 0 0 0 0 0 0 299 0 0 100 0 0
0 0 0 214 0 0 0 0 12 114 0 336 0 1 99 0 0
顺便说一下,CS(上下文切换值)较高的行对应于我刷新几个网站页面的时刻。
非常感谢您的任何建议。
答案1
一般来说,我发现当 apache 被设置为允许生成比您能处理的更多的子进程时,一旦达到系统限制,它就会冻结。一旦它被堵塞,它就不太擅长释放资源。所以我建议您一开始就降低 apache 的最大子进程数(很多)。看看 1 个子进程通常使用多少内存。然后将您的最大 avl ram 除以 1 个子进程使用的内存量,您可以使用该结果作为调整最佳子进程数的起点。
我的回答可能有些偏颇,但我认为 apache 并不适合用作 Web 服务器... 它消耗的资源远远超过了它应有的水平,因此对于像您运行的 VPS 这样的小型环境来说,它尤其不是一个很好的选择。尝试使用 nginx(例如,如果您使用 php,则使用 php-fpm)或 varnish 等替代方案。这些并不是 apache 的 1 对 1 替代品,但我发现它们是效率更高、更不容易因资源问题而冻结的 Web 服务器。
此外,在发布此类问题时,我建议您发布类似的统计数据,top
因为它们可以在您的高峰/麻烦时段提供更完整的情况,尽管只是一般情况。