【问题标题】:Mysql "memory usage" increasing and increasingMysql“内存使用量”越来越大
【发布时间】:2017-01-28 13:06:01
【问题描述】:

我有一个非常大的网站,使用 PHP 和 MYSQL 构建老式的。

我的网站上有超过 1,000 个不同的查询,位于不同的 PHP 页面上,很难将它们全部更新到 MYSQLI。

我购买了具有 4GB RAM 的 VPS 服务器,在过去的几个月中,我的页面加载速度非常慢。

当我重新启动服务器时,一切运行顺利,但几个小时/几天后,网站变得越来越慢,页面加载时间超过 3 秒。我注意到 mysqld 服务的内存使用量越来越大,从服务器重新启动时的 80MB 增加到大约 400MB 甚至更多的使用量。

我在 index.php mysql_close() 的末尾添加了,但连接数似乎仍在增加。

问题 什么会导致mysql内存使用量无限增加? 将我的所有查询更新到 MYSQLI 可能会提高性能?

一些信息:

innodb_version
5.5.31
protocol_version
10
slave_type_conversions
version
5.5.31-log
version_comment
MySQL Community Server (GPL)
version_compile_machine
x86_64
version_compile_os
Linux

存储引擎:混合(有些表是 INNODB,有些表是 MyISAM。 我的.cnf:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
max-connections=100000
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
thread_cache_size=5
table_open_cache=99390
sort_buffer_size=512M
read_rnd_buffer_size=512M
query_cache_size=512M
query_cache_limit = 16M
query_cache_type = 1
slow_query_log=1 
slow_query_log_file=slow_query_log.log # 
long_query_time=5
log-queries-not-using-indexes=1


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

当我使用 show processlist 时,我有大约 6-7 个查询在运行

【问题讨论】:

  • 第一个,当您的网站运行缓慢时,在 mysql 控制台中从根目录运行 show processlist 查询以查看发生了什么
  • 我有一堆问题:什么版本的 MySQL?你用的是什么存储引擎? my.cnf 中的缓冲区设置是什么?你在你的代码中做了多少种?抱歉 - 根据您的陈述无法回答这个问题。而 MySQL 我不会产生太大的性能差异。
  • 用所有这些信息更新了我的问题,@TGray。我不知道我做了多少排序,但我猜不多。我的主要问题是使用 SELECT 和 ORDER BY 时有近 300k 行的表,尽管查询是针对特定的 user_id。

标签: mysql performance


【解决方案1】:

max-connections=100000 -- 哎呀!降到 1000

table_open_cache=99390 -- 下降到 2000 年

sort_buffer_size=512M -- 降低到 RAM 的 1%,例如 40M

read_rnd_buffer_size=512M -- 同上

query_cache_size=512M -- 太大了;减慢速度;降至 40M

long_query_time=5 -- 不够低,抓不到太多;降到 2

log-queries-not-using-indexes=1 -- 在没有提供太多信息的情况下使慢日志变得混乱;更改为 0

您没有说您使用的是哪个引擎。阅读 this 获取有关 MyISAM 和 InnoDB 的建议。

1000 页——不算太多。

哪个网络服务器?如果是 Apache,请不要将 MaxClients 设置为超过 20。

【讨论】:

  • 我在帖子中提到我的表是 MyIsam 和 InnoDB 的混合体。我一直在阅读这份工作人员,但真的很难对此做出决定。去试试你的配置,谢谢。它是阿帕奇
  • Mysqld 越来越大,好像所有打开的连接都没有关闭,我不知道为什么会这样......
  • mysqld 的内存使用会增长,直到达到某个限制,然后会略有波动。我的建议旨在防止该限制过大。交换对于 MySQL 来说是可怕的
  • 交换是什么意思?
  • 当正在运行的程序需要超过可用 RAM(在我们的例子中为 4GB)时,操作系统会将部分交换到磁盘。这会减慢速度,但总比系统崩溃要好。但是,MySQL 对 RAM 的使用假设没有交换,因此当它发生时性能会受到严重影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 2016-03-05
  • 2014-05-02
  • 1970-01-01
  • 2017-10-15
  • 2019-07-01
相关资源
最近更新 更多