我们有一个使用 WordPress + WooCommerce 的商店。
我们的服务器有 24 个 CPU 和 128GB RAM。有几天我们同时收到多个订单,CPU 完全超载,网站长时间瘫痪。
我们正在使用 MariaDB 10.2
有谁有过这样的经验,这是否正常或者配置有错误?
这是我的配置文件的相关部分:
#
# * Fine Tuning
#
max_connections = 500
connect_timeout = 5
wait_timeout = 600
max_allowed_packet = 16M
thread_cache_size = 128
sort_buffer_size = 4M
bulk_insert_buffer_size = 16M
tmp_table_size = 32M
max_heap_table_size = 32M
#
# * MyISAM
#
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched. On error, make copy and try a repair.
myisam_recover_options = BACKUP
key_buffer_size = 128M
#open-files-limit = 2000
table_open_cache = 400
myisam_sort_buffer_size = 512M
concurrent_insert = 2
read_buffer_size = 2M
read_rnd_buffer_size = 1M
#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
default_storage_engine = InnoDB
# you can't just change log file size, requires special procedure
#innodb_log_file_size = 50M
innodb_buffer_pool_size = 256M
innodb_log_buffer_size = 8M
innodb_file_per_table = 1
innodb_open_files = 400
innodb_io_capacity = 400
innodb_flush_method = O_DIRECT
答案1
key_buffer_size
我猜想由于和值太小,您的磁盘 i/o 过多innodb_buffer_pool_size
。没有确切的建议来调整它们,但您应该注意以下几点:
key_buffer_size
应该大于 MYISAM 索引的总量,以便将它们全部放入 RAM 中。
innodb_buffer_pool_size
如果有可用 RAM,最好是所有 INNODB 表大小的 1.4 * 倍。
您必须非常小心地调整join_buffer_size
(sort_buffer_size
以及其他值,例如 read_buffer_size 和 read_rnd_buffer_size、线程堆栈)值,因为它们用于每个连接,并且对于最多 500 个同时连接,您很容易超出实际可用的 RAM。
无论如何,在调整之前,您必须mysqltuner
首先启动并彻底检查报告的每一行。请记住,给出的建议mysqltuner
是一般性的,可能不适合您具体的情况。
答案2
对于您的 my.cnf-ini [mysqld] 部分,请考虑以下建议(即使此时只有部分 my.cnf-ini 可见)。
read_buffer_size=128K # from 2M to minimize read data requirements
read_rnd_buffer_size=256M # from 1M to minimize read data requirements
thread_cache_size=100 # from 128 for V8 suggested CAP to avoid Out Of Memory
随着所需信息的数据可供分析,其他机会也将变得明显。