117

I would like to know how it is possible to set an upper limit on the amount of memory MySQL uses on a Linux server.

Right now, MySQL will keep taking up memory with every new query requested so that it eventually runs out of memory. Is there a way to place a limit so that no more than that amount is used by MySQL?

4

6 回答 6

188

MySQL 的最大内存使用量很大程度上取决于硬件、您的设置数据库本身。

硬件

硬件是显而易见的部分。RAM 越多,磁盘ftw越快越好。不要相信那些每月或每周的新闻信件。MySQL 不能线性扩展——甚至在 Oracle 硬件上也不能。这比那有点棘手。

底线是:对于你的MySQL 设置推荐什么没有一般的经验法则。这一切都取决于当前的使用情况或预测。

设置和数据库

MySQL 提供了无数的变量和开关来优化其行为。如果遇到问题,您真的需要坐下来阅读(f'ing)手册。

至于数据库——一些重要的限制:

  • 表引擎 ( InnoDB, MyISAM, ...)
  • 尺寸
  • 指数
  • 用法

大多数关于 stackoverflow 的 MySQL 技巧都会告诉你 5-8 个所谓的重要设置。首先,并非所有这些都很重要——例如,将大量资源分配给 InnoDB 而不使用 InnoDB 没有多大意义,因为这些资源被浪费了。

或者——很多人建议提高max_connection变量——好吧,他们几乎不知道这也意味着 MySQL 将分配更多资源来满足这些max_connections需求——如果需要的话。更明显的解决方案可能是关闭 DBAL 中的数据库连接或降低wait_timeout以释放这些线程。

如果你明白我的意思——真的有很多很多东西需要阅读和学习。

引擎

表引擎是一个非常重要的决定,很多人很早就忘记了这些,然后突然发现自己在与一个 30 GB 大小的表作斗争,该MyISAM表会锁定并阻塞他们的整个应用程序。

我并不是说MyISAM 很烂,但InnoDB可以调整为几乎或几乎一样快地响应,MyISAM并提供诸如行锁定之类的东西,UPDATEMyISAM在写入时锁定整个表。

如果您可以在自己的基础架构上运行 MySQL,您可能还想查看percona 服务器,因为其中包括来自 Facebook 和 Google 等公司的大量贡献(他们知道得很快),它还包括 Percona 自己的 drop-代替InnoDB,称为XtraDB

有关 percona-server(和-client)设置(在 Ubuntu 上),请参阅我的要点:http: //gist.github.com/637669

尺寸

数据库大小非常非常重要——信不信由你,Intarwebs 上的大多数人从未处理过大型和编写密集的 MySQL 设置,但这些确实存在。有些人会说“使用 PostgreSQL!!!111”之类的话,但我们暂时忽略它们。

底线是:从尺寸来看,要做出关于硬件的决定。您无法真正让 80 GB 的数据库在 1 GB 的 RAM 上快速运行。

指数

不是:越多越好。只需设置所需的索引,并且必须使用EXPLAIN. 再加上 MySQL 的EXPLAIN功能确实有限,但这只是一个开始。

建议配置

关于这些my-large.cnfmy-medium.cnf文件——我什至不知道那些是为谁而写的。自己滚。

调优入门

一个很好的开始是调音入门。这是一个 bash 脚本(提示:你需要 linux),它接受 and 的输出SHOW VARIABLES并将SHOW STATUS其包装成希望有用的推荐。如果您的服务器已经运行了一段时间,建议会更好,因为会有数据作为它们的基础。

不过,调音底漆并不是一种神奇的调味汁。您仍然应该阅读它建议更改的所有变量。

阅读

我真的很喜欢推荐mysqlperformanceblog。它是各种 MySQL 相关技巧的绝佳资源。而且不仅是 MySQL,他们还非常了解正确的硬件或 AWS 的推荐设置等。这些人拥有多年的经验。

当然,另一个很好的资源是planet-mysql

于 2010-10-21T13:14:01.293 回答
39

我们使用这些设置:

etc/my.cnf
innodb_buffer_pool_size = 384M
key_buffer = 256M
query_cache_size = 1M
query_cache_limit = 128M
thread_cache_size = 8
max_connections = 400
innodb_lock_wait_timeout = 100

对于具有以下规格的服务器:

Dell Server
CPU cores: Two
Processor(s): 1x Dual Xeon
Clock Speed: >= 2.33GHz
RAM: 2 GBytes
Disks: 1×250 GB SATA
于 2010-09-14T13:11:24.297 回答
20

mysqld.exe 在 RAM 中使用 480 mb。我发现我在my.ini中添加了这个参数

table_definition_cache = 400

将内存使用量从 400,000+ kb 减少到 105,000kb

于 2014-06-27T08:29:48.597 回答
19

数据库内存使用是一个复杂的话题。MySQL 性能博客很好地解决了您的问题,并列出了许多“保留”内存非常不切实际的原因。

如果你真的想强加一个硬限制,你可以这样做,但你必须在操作系统级别这样做,因为没有内置设置。在 linux 中,您可以使用ulimit,但您可能必须修改 MySQL 的启动方式才能强制执行此操作。


最好的解决方案是调低你的服务器,这样通常的 MySQL 内存设置的组合将导致你的 MySQL 安装的内存使用量通常较低。这当然会对数据库的性能产生负面影响,但您可以调整的一些设置my.ini是:

key_buffer_size
query_cache_size
query_cache_limit
table_cache
max_connections
tmp_table_size
innodb_buffer_pool_size

我会从那里开始,看看你是否能得到你想要的结果。有很多 关于调整 MySQL 内存设置的文章。


编辑:

请注意,一些变量名称在 MySQL 的 5.1.x 新版本中已更改

例如:

table_cache

就是现在:

table_open_cache
于 2009-07-24T16:55:03.227 回答
6

关于 MYSQL 是如何吃掉内存的:https ://dev.mysql.com/doc/refman/8.0/en/memory-use.html

/etc/my.cnf

[mysqld]
...

performance_schema = 0

table_cache = 0
table_definition_cache = 0
max_connect_errors = 10000

query_cache_size = 0
query_cache_limit = 0

...

在具有 256MB 内存的服务器上运行良好。

于 2015-08-29T14:42:04.573 回答
0

如果您正在寻找优化您的 docker mysql 容器,那么下面的命令可能会有所帮助。我能够将 mysql docker 容器从默认的 480mb 运行到仅仅 100mbs

docker run -d -p 3306:3306 -e MYSQL_DATABASE=test -e MYSQL_ROOT_PASSWORD=tooor -e MYSQL_USER=test -e MYSQL_PASSWORD=test -v /mysql:/var/lib/mysql --name mysqldb mysql --table_definition_cache=100 --performance_schema=0 --default-authentication-plugin=mysql_native_password

于 2020-01-18T10:17:44.247 回答