优化 MySQL 设置 - mysqld 内存不足

优化 MySQL 设置 - mysqld 内存不足

我有点困惑,不知道应该在 my.conf 文件中更改哪些设置来优化我的服务器(由于流量太大,mysql 服务器不断崩溃)。

这是 my.cnf 文件:

[mysqld]

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

key_buffer              = 16M
max_allowed_packet      = 16M
myisam-recover         = BACKUP
#max_connections        = 100
#table_cache            = 64
#thread_concurrency     = 10

query_cache_limit       = 1M
query_cache_size        = 16M

服务器规格如下:

CPU Cores   2 cores
RAM (Memory)    1GB
SSD (Disk Space)    20GB

运行 Ubuntu 12.04 LTS

这是我的分区:

NAME   FSTYPE   SIZE MOUNTPOINT LABEL
vda              20G            
├─vda1 ext4     476M /boot      
├─vda2 swap     477M [SWAP]     
└─vda3 ext4    19.1G / 

任何帮助将非常感激。

查看错误日志,我发现 mysqld 内存不足:

Feb 17 11:02:06 111488 kernel: [8276839.559141] Out of memory: Kill process 20719 (mysqld) score 75 or sacrifice child
Feb 17 11:02:06 111488 kernel: [8276839.559209] Killed process 20719 (mysqld) total-vm:1347424kB, anon-rss:30524kB, file-rss:0kB

答案1

来自 serverguide wiki 的一般答案

MySQL 调谐器 安装 mysqltuner

MySQL Tuner 是一款实用的工具,它可以连接到正在运行的 MySQL 实例,并提供有关如何针对您的工作负载进行最佳配置的建议。服务器运行的时间越长,mysqltuner 提供的建议就越好。在生产环境中,请考虑等待至少 24 小时再运行该工具。您可以从 Ubuntu 存储库安装 mysqltuner:

sudo apt-get install mysqltuner

安装完成后,运行它:

 mysqltuner

并等待其最终报告。顶部部分提供了有关数据库服务器的一般信息,底部部分提供了在 my.cnf 中更改的调整建议。其中大部分都可以在服务器上实时更改而无需重新启动,请查看官方 MySQL 文档(链接在资源部分)以了解在生产中要更改的相关变量。以下是来自生产数据库的示例报告的一部分,该报告显示增加查询缓存量可能会带来一些好处:

-------- 建议 -----------------------------------------------------------------
一般建议:
    运行 OPTIMIZE TABLE 对表进行碎片整理,以获得更好的性能
    逐渐增加 table_cache 以避免文件描述符限制
需要调整的变量:
    密钥缓冲区大小(>1.4G)
    查询缓存大小 (> 32M)
    表缓存 (> 64)
    innodb_buffer_pool_size(>= 22G)

关于数据库调优的最后一点意见:虽然我们可以大致说某些设置是最好的,但性能可能因应用程序而异。例如,最适合 Wordpress 的设置可能不适合 Drupal、Joomla 或专有应用程序。性能取决于查询类型、索引的使用、数据库设计的效率等等。您可能会发现花一些时间根据您使用数据库的应用程序来搜索数据库调优技巧很有用。一旦您超过某个点,您所做的任何调整都只会导致微小的改进,您最好改进应用程序,或者通过使用更强大的硬件或添加从属服务器来扩展数据库环境。


  • 查看 mysqltuner 报告的性能指标部分。将最大可能的内存保持在 50% 以下。
  • tmp_table_sizemax_heap_table_size variable:保持这些相等且较高。
  • join_buffer_size,少量增加;它将乘以max_connections
  • innodb_buffer_pool_size. 使其升高。

答案2

另一个可能的修复方法是在 /etc/mysql/my.cnf 配置的 [mysqld] 部分中使用以下内容。

performance_schema = off

来源:https://serverfault.com/questions/564748/mysql-mariadb-crashes-frequently

答案3

docker compose 的解决方案

mysql:
    volumes:
        - ./config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf

配置内容 ./config/mysql/my.cnf

[mysqld]
performance_schema = off

相关内容