服务器详细信息:
RAM: 16GB
HDD: 1000GB
OS: Linux 2.6.32-220.7.1.el6.x86_64
Processor: 6 Core
请参阅下面的链接查看我的#top 预览:
我经常在我的 plesk 面板中看到标题中提到的错误,并且我的 /etc/my.cnf 配置如下:
bind-address=127.0.0.1
local-infile=0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
max_connections=20000
max_user_connections=20000
key_buffer_size=512M
join_buffer_size=4M
read_buffer_size=4M
read_rnd_buffer_size=512M
sort_buffer_size=8M
wait_timeout=300
interactive_timeout=300
connect_timeout=300
tmp_table_size=8M
thread_concurrency=12
concurrent_insert=2
query_cache_limit=64M
query_cache_size=128M
query_cache_type=2
transaction_alloc_block_size=8192
max_allowed_packet=512M
[mysqldump]
quick
max_allowed_packet=512M
[myisamchk]
key_buffer_size=128M
sort_buffer_size=128M
read_buffer_size=32M
write_buffer_size=32M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
open_files_limit=8192
由于我的服务器 httpd conf 设置为/etc/httpd/conf.d/swtune.conf
,并且配置如下:在 prefork.c 中:
<IfModule prefork.c>
StartServers 8
MinSpareServers 10
MaxSpareServers 20
ServerLimit 1536
MaxClients 1536
MaxRequestsPerChild 4000
</IfModule>
如果我运行grep -i maxclient /var/log/httpd/error_log
,那么每天都会看到这个错误:
[root@u16170254 ~]# grep -i maxclient /var/log/httpd/error_log
[Sun Apr 15 07:26:03 2012] [error] server reached MaxClients setting, consider raising the MaxClients setting
[Mon Apr 16 06:09:22 2012] [error] server reached MaxClients setting, consider raising the MaxClients setting
我尝试解释我所做的所有更改,以确保我的服务器正常运行,但大多数时候我的服务器都处于宕机状态。请帮我更改哪些参数,以确保我的服务器正常运行,我的网站可以快速加载。加载我的网站花费了太多时间。
答案1
哇。
如果MaxClients
设置为 1536,并且每个 Apache 子进程使用大约 69MB 的 RAM,则您需要超过 100GB 的 RAM 才能避免交换出 Apache 内存的“热”部分。我建议您降低该值,直到它适合您的可用 RAM 为止吗?像这样的交换将使您的服务器变得非常慢。
由于您在同一台服务器上运行 MySQL,因此我会为每个服务分配大约一半的可用 RAM,因此这MaxClients 115
对您来说是合适的。如果您想在 MySQL 周围留出一点喘息空间,也许可以稍微低一点。
现在,我们来谈谈 MySQL,它很可能是导致您的服务器变慢的真正原因。MySQL 占用大量 CPU 和极少的 RAM。有三件事要做:
- 打开 mysql 慢查询日志,并将时间设置
long_query_time
为 10 或 20 秒等较高的时间。慢慢降低该设置,直到开始捕获慢查询。一旦您知道哪些查询导致了问题,就通过添加来调整它们合适的索引或修改查询。查询调优是一个重要主题,有几本关于它的好书。 - 运行 mysqltuner.pl 并按照其建议操作。(
wget mysqltuner.pl
) - 安装服务器性能监控工具,例如 Cacti、Munin 或 Zabbix(还有其他选项),并添加“更好的 Cacti 模板”或“Appaloosa 模板”。
按照上面的“每个服务一半”的想法,mysqltuner.pl
将告诉您 MySQL 可以使用的最大 RAM 量,但您不太可能看到这个,因为它依赖于每个连接的 RAM 分配,并且您永远不会看到您允许的所有 20,000 个连接。相反,观察 MySQL 实际使用的内容并使其使用剩余 RAM 的约 2/3 - 3/4 是一个合理的值。
你应该降低您的query_cache
和query_cache_limit
和提高key_buffer_size
或者innodb_buffer_pool
取决于您使用的引擎。 mysqltuner.pl
会有比我更好的建议。
您用作此问题标题的错误消息与 MySQL 的设置有关wait_timeout
。某个进程已打开与 MySQL 的连接,然后在命令之间等待至少 300 秒。如果这是一个 Web 请求,则提高此值不是正确的解决方案。300 秒比人们等待 Web 请求完成的时间要长得多。修复导致平均负载如此之高的任何原因(可能是其他慢速查询和交换),请求就会更快。