mysql - MariaDB配置优化

标签 mysql debian

所以我认为我真的搞乱了 mariadb 的配置文件。我使用 apache2 和 mysql 的专用服务器。我不知道服务器响应时间是否是由于 mysql 响应查询的时间太长造成的,或者是否是代码本身造成的。我已经尝试过一些配置生成器,但我觉得它们不起作用。以下是专用服务器规范:

英特尔 C2750 32 GB 内存 256 GB 固态硬盘

#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]

#
# * Basic Settings
#
user        = mysql
pid-file    = /var/run/mysqld/mysqld.pid
socket      = /var/run/mysqld/mysqld.sock
port        = 3306
basedir     = /usr
datadir     = /var/lib/mysql
tmpdir      = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
# Skip reverse DNS lookup of clients
skip-name-resolve
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
# bind-address      = 127.0.0.1

#
# * Fine Tuning
#
key_buffer_size     = 5048M
key-buffer-size     = 32M
max_allowed_packet  = 2024M
max-allowed-packet  = 16M 
max-connect-errors  = 1000000
thread_stack        = 1024K
thread_cache_size       = 30
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam_recover_options  = BACKUP
max_connections        = 500
table_cache            = 100
table_open_cache = 3000
table_definition_cache = 9000
join_buffer_size = 300K
performance_schema = ON

#thread_concurrency     = 10
max_user_connections    = 455
#
# * Query Cache Configuration
#
query_cache_limit   = 1048M
query_cache_size    = 0
query_cache_type    = 0

slow-query-log = 1
slow-query-log-file = /var/lib/mysql/mysql-slow.log
long_query_time = 1
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
#general_log_file        = /var/log/mysql/mysql.log
#general_log             = 1
#
# Error log - should be very few entries.
#
log_error = /var/log/mysql/error.log
#
# Enable the slow query log to see queries with especially long duration
#slow_query_log_file    = /var/log/mysql/mariadb-slow.log
#long_query_time = 10
#log_slow_rate_limit    = 1000
#log_slow_verbosity = query_plan
#log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
#server-id      = 1
#log_bin            = /var/log/mysql/mysql-bin.log
expire_logs_days    = 10
max_binlog_size   = 100M
#binlog_do_db       = include_database_name
#binlog_ignore_db   = exclude_database_name

#
# * 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!
innodb_buffer_pool_size = 15G
#innodb_s_lock_spin_rounds = 120
#innodb_thread_concurrency = 0
innodb_log_file_size = 3G
innodb_buffer_pool_instances = 25

tmp-table-size                 = 32M
max-heap-table-size            = 32M
query-cache-type               = 0
query-cache-size               = 0
max-connections                = 500
thread-cache-size              = 50
open-files-limit               = 65535
table-definition-cache         = 4096
table-open-cache               = 100
innodb-flush-method            = O_DIRECT
innodb-log-files-in-group      = 2
innodb-log-file-size           = 512M
innodb-flush-log-at-trx-commit = 2
innodb-file-per-table          = 1
innodb-buffer-pool-size        = 26G

#innodb_buffer_size = 256M
#
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates you can use for example the GUI tool "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem
#
# Accept only connections using the latest and most secure TLS protocol version.
# ..when MariaDB is compiled with OpenSSL:
# ssl-cipher=TLSv1.2
# ..when MariaDB is compiled with YaSSL (default in Debian):
# ssl=on

#
# * Character sets
#
# MySQL/MariaDB default is Latin1, but in Debian we rather default to the full
# utf8 4-byte character set. See also client.cnf
#
character-set-server  = utf8mb4
collation-server      = utf8mb4_general_ci

#
# * Unix socket authentication plugin is built-in since 10.0.22-6
#
# Needed so the root database user can authenticate without a password but
# only when running as the unix root user.
#
# Also available for other users if required.
# See https://mariadb.com/kb/en/unix_socket-authentication-plugin/

# this is only for embedded server
[embedded]

# This group is only read by MariaDB servers, not by MySQL.
# If you use the same .cnf file for MySQL and MariaDB,
# you can put MariaDB-only options here
[mariadb]

# This group is only read by MariaDB-10.1 servers.
# If you use the same .cnf file for MariaDB of different versions,
# use this group for options that older servers don't understand
[mariadb-10.1]

最佳答案

请记住,如果您多次指定某个选项,则只有该选项的最后设置才会生效。您有相当多的重复,这只会导致混淆哪个值真正有效。

我建议您执行以下操作:

  • 字母顺序对 my.cnf 中的行进行排序以查找重复项(我指的是 [mysqld] 部分中的行)。
  • 选择您真正想要生效的值,并删除同一选项中具有多余设置的其他行。
  • 删除将选项设置为其默认值的选项行。
  • 删除您没有特定原因选择非默认值的选项行。

我注意到你有:

innodb-buffer-pool-size        = 26G

这是 32G RAM 的 81%。假设缓冲池至少使用了 10% 的额外空间,那么它实际使用了 28.6G。因此,您只有 3.4G 可以满足服务器上的所有其他 RAM 需求,包括 MySQL、Apache、其他进程和操作系统本身。

除了缓冲池之外,MySQL 还有其他 RAM 用途,尤其是每个连接,并且最多允许 500 个连接。

您还在同一服务器上运行 Apache,当然还有由 Apache 运行的任何 Web 应用程序。它们也将使用 RAM,我无法预测多少,因为这完全取决于您的应用程序代码。 Apache 允许运行多个并发请求,因此您可能有数十或数百个处理请求的 Web 应用程序副本。

所以我想知道您是否使用了太多 RAM,并强制服务器使用磁盘上的交换空间。这对于任何服务器来说都是性能 killer ,因为磁盘(甚至 SSD)比 RAM 慢几个数量级。

您应该使用topfreevmstat监视内存使用情况。如果您看到 RAM 耗尽并且系统使用交换,您应该尝试减少 RAM 的分配,或者限制连接数或 Apache 请求数。您还可以安装更多 RAM,甚至将 Apache 移至第二个专用服务器。

关于mysql - MariaDB配置优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48044675/

相关文章:

debian - 在/etc/apt/sources.list 中设置镜像,使用 Preseed

mysql - 求平均时间(调整到小数点后两位)和总时间

Linux Mint 上的 Xampp 中的 MySQL "Deactivated"状态

javascript - 有没有办法通过列类型/属性来格式化 MySQL celldata?

php - 如何查看HH :MM is in two intervals HH:MM - HH:MM的当前时间

linux - 如何使用我的 debian 软件包安装软件包?

mysql LOAD DATA INTOFILE ERROR 1064 42000 错误行 1

docker - 如何在 Debian/Ubuntu Docker 容器中设置语言环境?

linux - 我如何处理服务器上的文件并使它们保持同步?

objective-c - 无法编译 .deb 包; make package 命令返回错误