服务器内存占用近8GB

服务器内存占用近8GB

最近,我们的服务器遇到了内存问题。从几周前开始,我们的服务器加载速度非常慢。访问电子邮件和网站确实需要很长时间。然后我们要求服务器技术支持为我们重启服务器。重启后,一切恢复正常。我们认为是时候升级内存了。我们的服务器上原本只有 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

首先,和评论中的其他一些人一样,我非常关心minerdbrute流程。谷歌上的一点侦探工作表明,这些名称与比特币挖矿有关,自动网络流量生成(例如: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

相关内容