如何让 MySQL 使用更少的内存?

Posted

技术标签:

【中文标题】如何让 MySQL 使用更少的内存?【英文标题】:How to make MySQL use less memory? 【发布时间】:2017-03-04 12:11:00 【问题描述】:

我正在尝试使用 Drush 将数据库更新到只有几个节点和 85 个模块的 Drupal 7 站点...因为更新几乎每次都会死掉很明显,对于具有 512MB 的 VPS 和它的容器化服务(mysqlnginxphp-fpm等),内存不够……

据我所知,每次 MySQL 被内核杀死时:

内存不足:杀死进程 4310 (mysqld)

我的问题是,如何配置 MySQL 服务以避免它被“暗杀”? MySQL配置文件中有哪些参数可以降低mysqld进程的内存消耗?

我在 DEV 中,所以我不介意进程是否变慢。我只想知道在不增加内存的情况下,我必须调整哪些参数才能在更新过程中幸存下来。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

我知道这个问题与 docker 无关,但如果有人使用 mysql 和 docker,我可以在 中运行 mysql 容器>非常便宜的服务器512 mb

我使用这些 docker-compose 参数基于@Hossein 答案: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"

【讨论】:

【参考方案2】:

我在 Vultr 的 512 Mb RAM 中使用 Fedora 29 和 MariaDB 进行配置。使用大约 26% 的 RAM。

[mysqld]
performance_schema = off
key_buffer_size = 16M
query_cache_size = 2M
query_cache_limit = 1M
tmp_table_size = 1M
innodb_buffer_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

在小型 VPS 中,不要忘记启用交换。例如,在 Vultr 中,默认设置是无交换。在数字海洋中也是如此。

【讨论】:

query_cache_size, query_cache_limit 在 MySQL 8 中被删除。【参考方案3】:

只有你需要:

[mysqld]
performance_schema = off

【讨论】:

这一个对我产生了影响,实际使用的内存从 175M 减少到 37M。 这是整个互联网有史以来最好的答案! 这个参数在哪个文件中? 文件在/etc/mysql/my.cnf【参考方案4】:

这个配置在 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

【讨论】:

不应该 query-cache-limit 是 query_cache_limit 吗? 你可能指的是sort_buffer_size = 512K而不是sort_buffer_size = 512M【参考方案5】:

您有一个只有 512MB 内存的虚拟机?你正在运行多个东西(Drupal,MySQL)?你会很幸运能够让它工作。这些设置可能足以缩小 MySQL 以运行:

key_buffer_size = 5M
innodb_buffer_pool_size = 60M

同时,不要增加 my.cnf 中的任何值。如果我的建议还不够;让我们看看你所有的 my.cnf;可能还有其他可以合理减少的东西。

您运行的是哪个版本的 MySQL?

【讨论】:

谢谢瑞克。 MySQL 没有读取我的“my.cnf”文件,这让我怀疑我必须进行哪些调整才能使其正常工作。 MySQL 在一个 docker 容器中,并且配置不正确。 MySQL 可以在 DEV 环境中以低内存消耗完美运行。【参考方案6】:

这样的参数有几十个,你可以在mysqlserver system variables文档中找到它们的详细描述。通常,查找其中包含单词size 的变量。特别要注意innodb_buffer_pool_size,因为默认值是 128MB,而在专用服务器上的推荐值是物理内存的 80%。

【讨论】:

80% 对于小型 VM 来说太多了。 我没有说他应该设置为 80%,我指出了这个特殊设置,因为它通常设置为高水平,因为推荐设置为 80%。 谢谢。 innodb_buffer_pool_size 是这里最重要的。起初我无法让它与我的配置一起使用,因为 MySQL 在一个 docker 容器中,而我对容器的设置是错误的。现在容器正在读取 my.cnf 文件,一切正常。

以上是关于如何让 MySQL 使用更少的内存?的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 itertools.permutations 时出现 MemoryError,如何使用更少的内存?

如何在 Sieve_of_Eratosthenes 中使用更少的内存

哪个向量和地图,使用更少的内存(大量数据和未知大小)

为啥在这段代码中向量比指针使用更少的内存?

调用垃圾回收会导致程序在java中使用更少的堆内存

为啥尽管我在变量中使用 malloc 分配更多内存,但当我打印变量的大小时,它仍然显示更少的内存/字节? [复制]