我正在尝试使用 Drush 将数据库更新到只有几个节点和 85 个模块的 Drupal 7 站点...由于更新几乎每次都会终止,这一点很明显,对于具有 512MB 的 VPS 及其容器化服务(mysql 、nginx、php-fpm 等),内存不够...
每次 MySQL 被内核杀死时,据我从日志中可以理解:
内存不足:杀死进程 4310 (mysqld)
我的问题是,如何配置MySQL服务以避免它被“暗杀”? MySQL配置文件中的哪些参数可以降低mysqld进程的内存消耗?
我从事开发工作,所以我不介意过程是否变慢。我只是想知道我必须调整哪些参数才能在更新过程中生存而不增加内存。
感谢您的帮助。
只有你需要:
[mysqld]
performance_schema = off
我在 Vultr 的 512 Mb RAM 中的配置,使用 Fedora 29 和 MariaDB。使用约 26% 的 RAM。
[mysqld]
performance_schema = off
key_buffer_size = 16M
tmp_table_size = 1M
innodb_buffer_pool_size = 1M
innodb_log_buffer_size = 1M
max_connections = 25
sort_buffer_size = 512K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
join_buffer_size = 128K
thread_stack = 196K
在小型 VPS 中,不要忘记启用交换。例如,在 Vultr 中,默认设置是不交换。数字海洋也是如此。
这样的参数有几十个,你可以在mysql服务器系统变量文档中找到所有这些参数并有详细描述。一般来说,查找其中包含单词
size
的变量。特别要注意的是 innodb_buffer_pool_size
,因为默认值为 128MB,在专用服务器上的建议值为物理内存的 80%。
此配置适用于我的 VPS 512M,希望这有帮助...
[mysqld]
performance_schema = off
port = 3306
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
key_buffer_size = 16M
query_cache_size = 2M
query-cache-limit = 1M
tmp_table_size = 1M
innodb_buffer_pool_size = 1M
innodb_additional_mem_pool_size = 1M
innodb_log_buffer_size = 1M
max_connections = 25
sort_buffer_size = 512M
read_buffer_size = 256K
read_rnd_buffer_size = 512K
join_buffer_size = 128K
thread_stack = 196K
binlog_cache_size = 0M
# Disabling symbolic-links is recommended to prevent assorted security risks
#symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
您的虚拟机内存只有 512MB? 您正在运行多个东西(Drupal、MySQL)? 如果你能让它发挥作用,你会很幸运。 这些设置可能足以将 MySQL 缩小到足以运行:
key_buffer_size = 5M
innodb_buffer_pool_size = 60M
同时,不要增加 my.cnf 中的任何值。 如果我的建议还不够;让我们看看你的所有 my.cnf;可能还有其他可以合理减少的事情。
您运行的是哪个版本的 MySQL?
我知道这个问题与docker无关,但是如果有人在docker中使用mysql,我可以在非常便宜的服务器中使用512 mb运行mysql容器。
我根据 @Hossein 答案使用了这些 docker-compose 参数:
mysqld --performance_schema=off
services:
mysql57:
image: mysql:5.7
command: mysqld --performance_schema=off
container_name: mysql57
restart: always
ports:
- "3306:3306"
volumes:
- /opt/mysql_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: changeme
MYSQL_USER: usr_acme
MYSQL_PASSWORD: changeme
MYSQL_DATABASE: db_acme
TZ: America/Lima
deploy:
resources:
limits:
memory: 400M
在此之前,如果没有
mysqld --performance_schema=off
,服务器变得非常慢,几分钟后就没有人可以连接。
您可以在命令中添加更多参数以减少 ram/cpu 的使用:
command:
- "mysqld"
- "--performance_schema=off"
- "--query_cache_size=2M"
- "--query_cache_limit=1M"
- "--foo=bar"
如果您正在努力应对 MySQL 的高内存使用率并需要轻量级配置,我可以通过这些调整将 MySQL 9 的内存消耗从 512MB(默认)降低到仅 130MB。非常适合低需求环境,如开发或小型服务器。
我的配置(默认值参考)
[mysqld]
# General
performance_schema=off # Default: on
skip-name-resolve # Default: off
event_scheduler=off # Default: on
# Memory and Buffers
innodb_buffer_pool_size=16M # Default: 128M
innodb_log_buffer_size=4M # Default: 16M
read_rnd_buffer_size=256K # Default: 256K
read_buffer_size=512K # Default: 128K
key_buffer_size=4M # Default: 8M
tmp_table_size=16M # Default: 16M
max_heap_table_size=16M # Default: 16M
# Connections
max_connections=10 # Default: 151
thread_stack=192K # Default: 256K
max_allowed_packet=1M # Default: 16M
sort_buffer_size=128K # Default: 2M
join_buffer_size=256K # Default: 256K
# Cache and Tables
table_open_cache=64 # Default: 2000
# Logs
log_error_verbosity=1 # Default: 3
max_binlog_size=1M # Default: 1G
skip-log-bin # Default: log-bin enabled
# Open Files
open_files_limit=64 # Default: 1024
对我有用的关键调整
结果:从 512MB 减少到只有 130MB 这种配置极大地减少了 MySQL 的内存占用,而不会影响小工作负载的功能。它非常适合开发环境或单一用途服务器等轻量级用例。