最近,我们的服务器遇到了内存问题。从几周前开始,我们的服务器加载速度非常慢。访问电子邮件和网站确实需要很长时间。然后我们要求服务器技术支持为我们重启服务器。重启后,一切恢复正常。我们认为是时候升级内存了。我们的服务器上原本只有 2GB 内存,因此我们将其升级为 8GB。
我们以为问题已经解决了。然而,升级 RAM 后,内存使用率却越来越高。好像总是达到最大使用率(例如,7.8 GB 内存中 456.5 MB 可用)。第二天,服务器完全瘫痪了,我们不得不要求技术支持人员为我们重新启动服务器。每次遇到问题,我们都必须要求支持人员为我们重新启动服务器。根据支持人员的说法,如果他们访问 SQL,内存就会恢复正常。但如果他们再次访问,内存会再次升高。因此,他们怀疑问题出在 SQL 查询上。
我想问一下,真的是 SQL 查询导致的问题吗?还是硬件问题?如果是 SQL,我怎么知道什么样的查询占用了这么大的内存?我该如何检查?我们的服务器正在运行以下详细信息:
OS: Linux 2.6.18
CPU: GenuineIntel, Intel(R)Xeon(R)CPU W3550 @ 3.07GHz
Average Load: 808.18;674.21;587.18
database records: 421,031 with 58 tables
我可以从 PHPMyAdmin 提供的查询统计数据:
select 314 k 11.98 k 66.37%
set option 34 k 1,296.59 7.18%
show fields 19 k 712.00 3.94%
update 16 k 620.61 3.44%
alter table 16 k 610.32 3.38%
change db 15 k 569.08 3.15%
insert 15 k 560.20 3.10%
show variables 11 k 434.01 2.40%
show tables 9,752 371.66 2.06%
begin 7,172 273.33 1.51%
执行‘top’的结果:
top - 15:20:07 up 1 day, 6:13, 1 user, load average: 497.30, 512.17, 542.15
Tasks: 7743 total, 5 running, 7738 sleeping, 0 stopped, 0 zombie
Cpu(s): 23.9%us, 50.9%sy, 0.1%ni, 25.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 8173372k total, 8048380k used, 124992k free, 1816952k buffers
Swap: 2096376k total, 216k used, 2096160k free, 533876k cached
我希望有人能给我一些建议,因为我已经遇到这个问题有一段时间了,而且我没有人可以寻求指导。提前谢谢大家。
更新:dmesg
CPU5: Temperature above threshold, cpu clock throttled
CPU7: Temperature/speed normal
CPU2: Temperature/speed normal
CPU6: Temperature/speed normal
CPU1: Temperature above threshold, cpu clock throttled
CPU3: Temperature/speed normal
CPU0: Temperature/speed normal
CPU4: Temperature/speed normal
CPU6: Temperature/speed normal
CPU5: Temperature/speed normal
CPU1: Temperature/speed normal
CPU2: Temperature/speed normal
CPU4: Temperature/speed normal
CPU7: Temperature/speed normal
CPU0: Temperature/speed normal
CPU3: Temperature/speed normal
brute[19592]: segfault at 0000000000000028 rip 00000000080a592f rsp 00000000ffae3a28 error 6
brute[19539]: segfault at 0000000000000028 rip 00000000080a592f rsp 00000000ffae3a28 error 6
CPU2: Temperature/speed normal
CPU4: Temperature/speed normal
CPU7: Temperature/speed normal
CPU1: Temperature/speed normal
CPU5: Temperature/speed normal
CPU3: Temperature/speed normal
CPU6: Temperature/speed normal
CPU0: Temperature/speed normal
CPU0: Temperature/speed normal
CPU7: Temperature/speed normal
CPU6: Temperature/speed normal
CPU1: Temperature/speed normal
CPU2: Temperature/speed normal
CPU3: Temperature/speed normal
CPU5: Temperature/speed normal
CPU4: Temperature/speed normal
brute[21368]: segfault at 0000000000000000 rip 0000000008048f03 rsp 00000000ffb82db0 error 4
今日 TOP 结果:
top - 10:42:47 up 3 days, 1:35, 1 user, load average: 4.35, 4.53, 4.59
Tasks: 187 total, 5 running, 182 sleeping, 0 stopped, 0 zombie
Cpu(s): 12.7%us, 38.5%sy, 0.0%ni, 48.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 8173372k total, 7800156k used, 373216k free, 1653768k buffers
Swap: 2096376k total, 216k used, 2096160k free, 2723732k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
27913 consulti 25 0 31096 3700 1172 R 100.2 0.0 1484:40 perl
27916 consulti 25 0 31096 3732 1204 R 100.2 0.0 1051:59 perl
28213 consulti 25 0 31096 3736 1204 R 100.2 0.0 1073:30 perl
28210 consulti 23 0 31096 3740 1204 S 86.9 0.0 1016:23 perl
3205 mysql 15 0 333m 55m 5416 S 13.6 0.7 143:36.73 mysqld
14616 apache 15 0 333m 33m 6056 S 4.7 0.4 1:02.12 httpd
25104 consulti 18 0 31096 3732 1204 R 4.7 0.0 486:12.74 perl
2702 root 15 0 12744 1148 808 R 0.3 0.0 0:00.01 top
1 root 15 0 10352 696 588 S 0.0 0.0 0:01.62 init
2 root RT -5 0 0 0 S 0.0 0.0 0:00.07 migration/0
3 root 34 19 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/0
4 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
5 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/1
6 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/1
7 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/1
8 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/2
9 root 34 19 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/2
10 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/2
11 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/3
12 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/3
13 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/3
14 root RT -5 0 0 0 S 0.0 0.0 0:00.05 migration/4
15 root 34 19 0 0 0 S 0.0 0.0 0:00.01 ksoftirqd/4
16 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/4
17 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/5
答案1
首先,和评论中的其他一些人一样,我非常关心minerd
和brute
流程。谷歌上的一点侦探工作表明,这些名称与比特币挖矿有关,自动网络流量生成(例如:DDoS 攻击中的一个节点),表明其他人可能正在将您的服务器用于他们自己的目的。
解决这个问题(请尽快修复),你也有可能通过一些数据库调整来改善情况。鉴于RandomSeed 发布的分析您可能有未使用的 RAM,而是在等待磁盘,并且您向服务器添加了 RAM 而没有对任何其他更改发表评论,我怀疑您的 MySQL 缓冲池太小。
这归结为数据库服务器性能调优 101:磁盘速度慢,内存速度快。数据库喜欢在内存中预加载或缓冲数据和索引,以减少访问速度较慢的硬盘的需求。MySQL 有一些配置设置可以控制允许缓存的数据量。如果您向服务器添加内存,但不更改这些 MySQL 设置,那么通过确保其他(非 MySQL)进程有足够的 RAM 来使用,这将有所帮助,但对您的核心数据库性能帮助不大;您还需要告诉 MySQL 您添加的新内存。
那么,该怎么做呢?对于 MySQL 来说,这有点棘手,因为 MySQL 支持多种存储引擎。您可能正在使用 InnoDB,但也可能使用 MyISAM,或者甚至将两者混合用于不同的表。不幸的是,如果不知道哪些表使用哪种存储引擎,以及(如果混合使用)查询大小和容量,就很难准确地建议如何更改 MySQL 配置。
答案2
您的问题不再是 RAM 限制的:
- 您有大约 2.5 GB 的“可用”RAM(124992k 可用 + 1816952k 缓冲区 + 533876k 缓存)
- 你的交换空间几乎没用过(使用了 216k)
不过,在升级到 8GB 之前可能并非如此。
现在很可能是 I/O 密集型的,而 MySQL 很可能是罪魁祸首:
- 平均负载极高(平均负载:497.30、512.17、542.15)
- 58 分钟的 CPU 时间 (TIME 57:59) vs 1 天的系统正常运行时间 (运行 1 天,6:13)
导致 CPU 密集型查询的最常见原因是I/O 等待时间过长(即从磁盘读取数据)。此类查询通常缺乏更好的索引和/或提取太多数据。
现在你需要确定这些查询是什么。一个好的起点是监控其执行时间。
答案3
从你的描述来看,我认为你的系统正在进行交换。你可能需要减少在 /etc/my.cnf 中配置的一些内存分配
您可以通过运行以下命令查看哪些进程正在使用物理内存:
ps aux --sort=-rss|head -10