我的网站(基于 Laravel)存在一个大问题,我目前有 1000 到 1500 个访问者,而我的 mariadb 存在问题,实际上当人们使用过滤器和其他需要使用 mysql 的选项时,服务器 CPU 会达到 1000%,按照我的配置:
Mysql:
[client]
socket=/var/lib/mysql/mysql.sock
[mysql]
max_allowed_packet = 128M
[mysqld]
ignore_db_dirs=cmsetiofiotest
local-infile=0
ignore_db_dirs=lost+found
character-set-server=utf8
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
bind-address=0.0.0.0
# optimized my.cnf for MariaDB 5.5.x
# by eva2000
# vbtechsupport.com
tmpdir=/home/mysqltmp
innodb=ON
#skip-federated
##skip-pbxt
##skip-pbxt_statistics
#skip-archive
#skip-name-resolve
#old_passwords
back_log = 1024
max_connections = 1500
key_buffer_size = 1024M
myisam_sort_buffer_size = 1024M
myisam_max_sort_file_size = 10240M
join_buffer_size = 2M
read_buffer_size = 2M
sort_buffer_size = 2M
table_definition_cache = 8192
table_open_cache = 8192
thread_cache_size = 384
wait_timeout = 1800
connect_timeout = 10
tmp_table_size = 1536M
max_heap_table_size = 1536M
max_allowed_packet = 128M
#max_seeks_for_key = 4294967295
#group_concat_max_len = 1024
max_length_for_sort_data = 1024
net_buffer_length = 16384
max_connect_errors = 100000
concurrent_insert = 2
read_rnd_buffer_size = 512K
bulk_insert_buffer_size = 8M
# query_cache boost for MariaDB >10.1.2+
# https://community.centminmod.com/posts/30811/
query_cache_limit = 1536K
query_cache_size = 256M
query_cache_type = 1
query_cache_min_res_unit = 2K
query_prealloc_size = 262144
query_alloc_block_size = 65536
transaction_alloc_block_size = 8192
transaction_prealloc_size = 4096
default-storage-engine = InnoDB
log_warnings=1
slow_query_log=0
long_query_time=1
slow_query_log_file=/var/lib/mysql/slowq.log
#log-error=/var/log/mysqld.log
# innodb settings
innodb_large_prefix=1
innodb_purge_threads = 4
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_open_files = 2000
innodb_data_file_path= ibdata1:10M:autoextend
innodb_buffer_pool_size = 12288M
## https://mariadb.com/kb/en/mariadb/xtradbinnodb-server-system-variables/#innodb_buffer_pool_instances
innodb_buffer_pool_instances=12
innodb_log_files_in_group = 2
innodb_log_file_size = 1024M
innodb_log_buffer_size = 32M
innodb_flush_log_at_trx_commit = 2
#innodb_thread_concurrency = 32
innodb_lock_wait_timeout=50
innodb_flush_method = O_DIRECT
innodb_support_xa=1
# 200 * # DISKS
innodb_io_capacity = 1600
innodb_io_capacity_max = 3200
innodb_read_io_threads = 7
innodb_write_io_threads = 7
innodb_flush_neighbors = 0
# mariadb settings
[mariadb]
#thread-handling = pool-of-threads
#thread-pool-size= 20
#mysql --port=3307 --protocol=tcp
#extra-port=3307
#extra-max-connections=1
userstat = 0
key_cache_segments = 1
aria_group_commit = none
aria_group_commit_interval = 0
aria_log_file_size = 1024M
aria_log_purge_type = immediate
aria_pagecache_buffer_size = 1024M
aria_sort_buffer_size = 256M
[mariadb-5.5]
innodb_file_format = Barracuda
innodb_file_per_table = 1
#ignore_db_dirs=
query_cache_strip_comments=0
innodb_read_ahead = linear
innodb_adaptive_flushing_method = estimate
innodb_flush_neighbor_pages = 1
innodb_stats_update_need_lock = 0
innodb_log_block_size = 512
log_slow_filter =admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
[mysqld_safe]
socket=/var/lib/mysql/mysql.sock
#log-error=/var/log/mysqld.log
#nice = -5
open-files-limit = 8192
[mysqldump]
quick
max_allowed_packet = 128M
[myisamchk]
tmpdir=/home/mysqltmp
key_buffer = 1536M
sort_buffer = 384M
read_buffer = 384M
write_buffer = 384M
[mysqlhotcopy]
interactive-timeout
[mariadb-10.0]
innodb_file_format = Barracuda
innodb_file_per_table = 1
# 2 variables needed to switch from XtraDB to InnoDB plugins
#plugin-load=ha_innodb
#ignore_builtin_innodb
## MariaDB 10 only save and restore buffer pool pages
## warm up InnoDB buffer pool on server restarts
#innodb_buffer_pool_dump_at_shutdown=1
#innodb_buffer_pool_load_at_startup=1
innodb_buffer_pool_populate=0
## Disabled settings
performance_schema=OFF
innodb_stats_on_metadata=OFF
innodb_sort_buffer_size=2M
innodb_online_alter_log_max_size=128M
query_cache_strip_comments=0
log_slow_filter =admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
[mariadb-10.1]
innodb_file_format = Barracuda
innodb_default_row_format = dynamic
innodb_file_per_table = 1
## wsrep specific
# wsrep_on=OFF
# wsrep_provider
# wsrep_cluster_address
# binlog_format=ROW
# default_storage_engine=InnoDB
# innodb_autoinc_lock_mode=2
# innodb_doublewrite=1
# query_cache_size=0
# 2 variables needed to switch from XtraDB to InnoDB plugins
#plugin-load=ha_innodb
#ignore_builtin_innodb
## MariaDB 10 only save and restore buffer pool pages
## warm up InnoDB buffer pool on server restarts
#innodb_buffer_pool_dump_at_shutdown=1
#innodb_buffer_pool_load_at_startup=1
innodb_buffer_pool_populate=0
## Disabled settings
performance_schema=OFF
innodb_stats_on_metadata=OFF
innodb_sort_buffer_size=2M
innodb_online_alter_log_max_size=128M
query_cache_strip_comments=0
log_slow_filter =admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
# Defragmenting unused space on InnoDB tablespace
innodb_defragment=1
innodb_defragment_n_pages=7
innodb_defragment_stats_accuracy=0
innodb_defragment_fill_factor_n_recs=20
innodb_defragment_fill_factor=0.9
innodb_defragment_frequency=40
以及 CPU 的使用情况:
我的服务器规格是:14 个专用 Intel® Xeon® Gold 6140 核心 64GB RAM 1 GB 连接
我已经对 redis 做了尽可能的优化,但什么也没做,负载也太大了,
谢谢并致以最诚挚的问候
答案1
显然,您遇到了性能问题:SMP 生产服务器上的所有 CPU 都达到了 100% 的最高使用率。“不好” :(
小小的争论:没有“1000%”这种事。不过……
在任何人提供帮助之前,您需要更好地了解根本原因:
也许你的应用程序有 bug。也许你可以调整数据库和/或服务器。或者也许你只需要购买更多硬件。
你可能会考虑“docker 化”您的基础设施,因此您可以根据需要“启动”更多实例来处理负载。
但您需要做的第一件事是建立“性能基准”,以便更好地了解导致性能不足的原因。我们甚至还没有足够的信息来确定问题出在数据库中、Laravel/PHP 中还是“其他什么地方”。
这些链接可能会有帮助: