在我于 7 月 1 日开始工作的公司中,我继承了一个运行 MySQL/Apache 堆栈的 Web 服务器,该服务器上正在运行一个用 Symfony 构建的网站。
该服务器运行 openSuSE 12.1,配备英特尔 Xeon 3470 CPU 和 12GB 内存。除了运行网站外,该服务器没有太多事情要做。
我们的服务器负载出现了一些严重的峰值,这在过去几周尤为明显。在这些时候,负载可能高达 40 到 60(有时甚至更高)。当这种情况发生在办公时间之外时,我发现服务器不会崩溃,尽管浏览器无法访问该网站,大约 30 分钟后,服务器会恢复正常负载。当这种情况发生在办公时间时,我会手动关闭 apache 和 MySQL,让服务器冷静下来,然后重新启动一切。
从我的访问日志和查询日志中,我没有发现任何特别异常的情况。我没有理由怀疑 DOS,而且我可以看到,在那些高峰负载期间有时需要一分钟或更长时间才能运行的查询,当我在本地 MySQL 服务器上运行它们时,或者当它们在“正常”情况下由网站运行时,运行得相当正常。
长话短说 - 从我目前收集到的信息来看,问题似乎是服务器有时会开始生成大量 Apache 进程以及大量 MySQL 连接。从 CPU 角度来看,大多数连接和进程似乎并没有做那么多,但它们却占满了 RAM。
我已在网上查阅过,特别是 mysql 方面的 max_connections 和 wait_timeout,以及 max_allowed_packet 和 apache 方面的 ServerLimit、MaxClients。我不知道空闲的 apache 进程是否有超时,但我可以想象这也会有所帮助。
关于 max_allowed_packet ... 它被设置为 209715200 (200 MB)。这似乎相当高,或者至少似乎解释了为什么在打开 40 多个连接的情况下,我的内存不足(至少,我理解 MySQL 为每个连接分配这 200 MB,无论它是否处于休眠状态。
我遇到的一个普遍问题是,在服务器调整方面我并不是真正的大英雄 :/ 主要是,我很担心对上述配置参数的任何调整都可能会终止正在运行的查询或请求,或者对网站运行造成任何破坏。
好吧,这实际上不是一个具体的问题,而是一个问题描述。不过,我还是欢迎任何建议或帮助,因为我并没有取得任何进展……
干杯,康斯坦丁