我有一个专用的服务器,其中包含以下信息:
128G RAM
6 cores/12 threads CPU, 3.4GHz
512 SSD storage
WHM/Cpanel latest
Apache/MySQL
Centos 7.x
我在这个服务器上有一个网站,该网站每天在特定时间的流量都很大,持续时间不到一小时。根据谷歌分析实时统计,高峰流量约为 6000 名用户。
当有大约 500 个用户时,服务器的平均页面加载时间约为 0.15 秒,并且网站代码针对 mysql 进行了高度优化。
问题是,在 2000 个并发用户之前,服务器从未出现过问题。超过这个数量的用户后,服务器负载有时会达到 100% 以上,mysql 负载会达到 600-900%,网站需要很长时间才能加载并显示服务器繁忙页面,大多数时候我不得不重新启动 mysql 和 apache 服务器。
这些是我在 WHM 中针对 Apache 的当前设置:
Start Servers = 5
Minimum Spare Servers = 5
Maximum Spare Servers =10
Server Limit (Maximum: 20,000) = 5000
Max Request Workers = 5000
Max Connections Per Child = 10000
Max Keep-Alive Requests = unlimited
Timeout = 300
这些是我在 my.cnf 中对 mysql 的设置,这是 WHM 的默认设置:
# This group is read both both by the client and the server
# use it for options that affect everything
#
[client-server]
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
[mysqld]
log-error=/var/lib/mysql/hosting.hostrose.com.err
performance-schema=0
default-storage-engine=MyISAM
innodb_file_per_table=1
innodb_buffer_pool_size=134217728
max_allowed_packet=268435456
open_files_limit=10000
max_connections=151
我的问题是,对于这些变量来说,最好的值是什么,才能为那么多的用户提供服务,而不会使服务器过载或挂起,特别是对于 apache 和 mysql 连接数来说。
答案1
所提供的信息自相矛盾:
2000 个并发用户
最大连接数=151
同时,Apache 将数量限制为 20。
我建议如下:
将表更改为 InnoDB。MyISAM 不利于并发。更改后,增加到
innodb_buffer_pool_size=134217728
更多90G
讨论: http://mysql.rjweb.org/doc.php/myisam2innodb将 Apache 更改为 30。
不要管 151 了;但要检查
SHOW GLOBAL STATUS LIKE 'Max_used_connections'; SHOW GLOBAL STATUS LIKE 'Threads_running';
前者表示有多少个连接同时连接到 MySQL。后者表示有多少个连接同时在执行某项操作。
mysql 负载达到 600-900%,网站加载时间过长,并显示服务器繁忙页面
这意味着您仍有一些查询需要优化。
如需进一步分析(如果设置和查询),请按照http://mysql.rjweb.org/doc.php/mysql_analysis
答案2
将 MySQL 最大连接数增加到 4000 以上并检查性能