我目前在专用服务器上有一个 LAMP,但 MariaDB(MySQL)存在严重问题。
我已经安装了一个每天有 10 万次页面浏览量的网站,并且由于查询的需要,数据库服务器必须具有缓存,否则网站速度会非常慢。
问题是我在文件的参数配置上存在错误:
/etc/my.cnf.d/server.cnf
服务器上升到100% CPU和100% 内存,不保存缓存而崩溃。
Hardware
Server type: Dedicated
CPU: Xeon E5-2650 v4 (x2)
RAM: 128GB
SSD: 2T
Software
Os: CentOS 7
Server: MariaDB v10.11.4
Tables: 66
Rows: 346,215,143
Engine: innoDB
Size data base: 74,837 MB
Collation database: utf8mb4_general_ci
Callation tables: utf8mb4_general_ci
这是文件:
[server]
[mysqld]
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
log-error = /var/log/mariadb/mariadb.log
pid-file = /var/lib/mysql/hippo.pid
port = 5000
#skip-networking
symbolic-links = 0
bind-address = 0.0.0.0
default_authentication_plugin = mysql_native_password
skip-name-resolve = 1
max_connections = 15000
max_user_connections = 15000
query_cache_type = 1
query_cache_size = 64G
query_cache_limit = 2G
innodb_file_per_table = ON
innodb_buffer_pool_size = 46G
innodb_flush_method = O_DIRECT
innodb_read_io_threads = 16
innodb_write_io_threads = 16
innodb_io_capacity = 5000
open_files_limit = 32768
innodb_open_files = 32768
innodb_log_buffer_size = 32M
innodb_log_file_size = 19G
innodb_data_file_path = ibdata1:10M:autoextend
innodb_flush_log_at_timeout = 3
key_buffer_size = 16G
sort_buffer_size = 16G
read_buffer_size = 16G
read_rnd_buffer_size = 16G
join_buffer_size = 128M
thread_cache_size = 64
tmp_table_size = 32G
max_heap_table_size = 32G
wait_timeout = 300
net_read_timeout = 300
net_write_timeout = 600
table_open_cache = 32768
[mysqld_safe]
open_files_limit = 32768
[galera]
[embedded]
[mariadb]
[mariadb-10.3]
谢谢 :)
答案1
每秒几页应该不成问题。(每秒 1K 页可能会有问题。)
许多设置可能会溢出您的大内存,因此应该缩小:
max_connections = 15000 --> 200
max_user_connections = 15000 --> 200
query_cache_size = 64G --> 100M
query_cache_limit = 2G --> 50M
innodb_buffer_pool_size = 46G --> 70G (yes, increase)
key_buffer_size = 16G --> 50M (if not using MyISAM)
sort_buffer_size = 16G --> 1G
read_buffer_size = 16G --> 1G
read_rnd_buffer_size = 16G --> 1G
tmp_table_size = 32G --> 1G
max_heap_table_size = 32G --> 1G
当“查询缓存”很大时,它的效率会不太高。
每个连接都会消耗大量 RAM,因此 15000*“lots” 可能会导致内存问题。由于您每秒仅传送几页,因此您不需要超过几个连接。
buffer_pool 是可能的缓存机制;大部分 RAM 应该分配给它。如果 RAM 达到 100%,则进一步减少它。
打开SlowLog查看哪些查询最慢;然后让我们看看所涉及的索引。
如果您在同一台服务器上运行 Web 服务器(Apache?),那么它的配置可能也过度了。
答案2
这确实是一个评论,但是它有点太长了,不适合放在小盒子里。
我建立了一个日均浏览量达 10 万的网站
这是一个毫无意义的指标。
不保存缓存并崩溃
崩溃是什么意思?核心转储?OOM Killer?还是其他?
您肯定存在能力问题 - 如何解决这些问题需要花费比在这里快速发帖更多的时间、信息和精力。
如果您的内存使用率达到 100%,则说明您的配置有误 - 但不一定是因为您的数据库配置有误。虽然 mysql 的最大连接数太高,但您需要在 Web 服务器上解决这个问题。
如果不详细了解工作负载,就不可能判断数据库中的其他设置是否合适或错误。