我有一台 Linux 服务器,运行着我们的 bacula 备份系统。这台机器运行得非常快,因为它需要大量进行交换。问题是,它只使用了 60% 的物理内存!
以下是 的输出free -m
:
free -m
total used free shared buffers cached
Mem: 3949 2356 1593 0 0 1
-/+ buffers/cache: 2354 1595
Swap: 7629 1804 5824
以及一些示例输出vmstat 1
:
procs -----------memory---------- ---swap-- -----io---- -system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 2 1843536 1634512 0 4188 54 13 2524 666 2 1 1 1 89 9 0
1 11 1845916 1640724 0 388 2700 4816 221880 4879 14409 170721 4 3 63 30 0
0 9 1846096 1643952 0 0 4956 756 174832 804 12357 159306 3 4 63 30 0
0 11 1846104 1643532 0 0 4916 540 174320 580 10609 139960 3 4 64 29 0
0 4 1846084 1640272 0 2336 4080 524 140408 548 9331 118287 3 4 63 30 0
0 8 1846104 1642096 0 1488 2940 432 102516 457 7023 82230 2 4 65 29 0
0 5 1846104 1642268 0 1276 3704 452 126520 452 9494 119612 3 5 65 27 0
3 12 1846104 1641528 0 328 6092 608 187776 636 8269 113059 4 3 64 29 0
2 2 1846084 1640960 0 724 5948 0 111480 0 7751 116370 4 4 63 29 0
0 4 1846100 1641484 0 404 4144 1476 125760 1500 10668 105358 2 3 71 25 0
0 13 1846104 1641932 0 0 5872 828 153808 840 10518 128447 3 4 70 22 0
0 8 1846096 1639172 0 3164 3556 556 74884 580 5082 65362 2 2 73 23 0
1 4 1846080 1638676 0 396 4512 28 50928 44 2672 38277 2 2 80 16 0
0 3 1846080 1628808 0 7132 2636 0 28004 8 1358 14090 0 1 78 20 0
0 2 1844728 1618552 0 11140 7680 0 12740 8 763 2245 0 0 82 18 0
0 2 1837764 1532056 0 101504 2952 0 95644 24 802 3817 0 1 87 12 0
0 11 1842092 1633324 0 4416 1748 10900 143144 11024 6279 134442 3 3 70 24 0
2 6 1846104 1642756 0 0 4768 468 78752 468 4672 60141 2 2 76 20 0
1 12 1846104 1640792 0 236 4752 440 140712 464 7614 99593 3 5 58 34 0
0 3 1846084 1630368 0 6316 5104 0 20336 0 1703 22424 1 1 72 26 0
2 17 1846104 1638332 0 3168 4080 1720 211960 1744 11977 155886 3 4 65 28 0
1 10 1846104 1640800 0 132 4488 556 126016 584 8016 106368 3 4 63 29 0
0 14 1846104 1639740 0 2248 3436 428 114188 452 7030 92418 3 3 59 35 0
1 6 1846096 1639504 0 1932 5500 436 141412 460 8261 112210 4 4 63 29 0
0 10 1846104 1640164 0 3052 4028 448 147684 472 7366 109554 4 4 61 30 0
0 10 1846100 1641040 0 2332 4952 632 147452 664 8767 118384 3 4 63 30 0
4 8 1846084 1641092 0 664 4948 276 152264 292 6448 98813 5 5 62 28 0
此外,按 CPU 时间排序的 top 输出似乎支持交换是导致系统陷入停滞的理论:
top - 09:05:32 up 37 days, 23:24, 1 user, load average: 9.75, 8.24, 7.12
Tasks: 173 total, 1 running, 172 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.6%us, 1.4%sy, 0.0%ni, 76.1%id, 20.6%wa, 0.1%hi, 0.2%si, 0.0%st
Mem: 4044632k total, 2405628k used, 1639004k free, 0k buffers
Swap: 7812492k total, 1851852k used, 5960640k free, 436k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ TIME COMMAND
4174 root 17 0 63156 176 56 S 8 0.0 2138:52 35,38 bacula-fd
4185 root 17 0 63352 284 104 S 6 0.0 1709:25 28,29 bacula-sd
240 root 15 0 0 0 0 D 3 0.0 831:55.19 831:55 kswapd0
2852 root 10 -5 0 0 0 S 1 0.0 126:35.59 126:35 xfsbufd
2849 root 10 -5 0 0 0 S 0 0.0 119:50.94 119:50 xfsbufd
1364 root 10 -5 0 0 0 S 0 0.0 117:05.39 117:05 xfsbufd
21 root 10 -5 0 0 0 S 1 0.0 48:03.44 48:03 events/3
6940 postgres 16 0 43596 8 8 S 0 0.0 46:50.35 46:50 postmaster
1342 root 10 -5 0 0 0 S 0 0.0 23:14.34 23:14 xfsdatad/4
5415 root 17 0 1770m 108 48 S 0 0.0 15:03.74 15:03 bacula-dir
23 root 10 -5 0 0 0 S 0 0.0 13:09.71 13:09 events/5
5604 root 17 0 1216m 500 200 S 0 0.0 12:38.20 12:38 java
5552 root 16 0 1194m 580 248 S 0 0.0 11:58.00 11:58 java
以下是按虚拟内存映像大小排序的结果:
top - 09:08:32 up 37 days, 23:27, 1 user, load average: 8.43, 8.26, 7.32
Tasks: 173 total, 1 running, 172 sleeping, 0 stopped, 0 zombie
Cpu(s): 3.6%us, 3.4%sy, 0.0%ni, 62.2%id, 30.2%wa, 0.2%hi, 0.3%si, 0.0%st
Mem: 4044632k total, 2404212k used, 1640420k free, 0k buffers
Swap: 7812492k total, 1852548k used, 5959944k free, 100k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ TIME COMMAND
5415 root 17 0 1770m 56 44 S 0 0.0 15:03.78 15:03 bacula-dir
5604 root 17 0 1216m 492 200 S 0 0.0 12:38.30 12:38 java
5552 root 16 0 1194m 476 200 S 0 0.0 11:58.20 11:58 java
4598 root 16 0 117m 44 44 S 0 0.0 0:13.37 0:13 eventmond
9614 gdm 16 0 93188 0 0 S 0 0.0 0:00.30 0:00 gdmgreeter
5527 root 17 0 78716 0 0 S 0 0.0 0:00.30 0:00 gdm
4185 root 17 0 63352 284 104 S 20 0.0 1709:52 28,29 bacula-sd
4174 root 17 0 63156 208 88 S 24 0.0 2139:25 35,39 bacula-fd
10849 postgres 18 0 54740 216 108 D 0 0.0 0:31.40 0:31 postmaster
6661 postgres 17 0 49432 0 0 S 0 0.0 0:03.50 0:03 postmaster
5507 root 15 0 47980 0 0 S 0 0.0 0:00.00 0:00 gdm
6940 postgres 16 0 43596 16 16 S 0 0.0 46:51.39 46:51 postmaster
5304 postgres 16 0 40580 132 88 S 0 0.0 6:21.79 6:21 postmaster
5301 postgres 17 0 40448 24 24 S 0 0.0 0:32.17 0:32 postmaster
11280 root 16 0 40288 28 28 S 0 0.0 0:00.11 0:00 sshd
5534 root 17 0 37580 0 0 S 0 0.0 0:56.18 0:56 X
30870 root 30 15 31668 28 28 S 0 0.0 1:13.38 1:13 snmpd
5305 postgres 17 0 30628 16 16 S 0 0.0 0:11.60 0:11 postmaster
27403 postfix 17 0 30248 0 0 S 0 0.0 0:02.76 0:02 qmgr
10815 postfix 15 0 30208 16 16 S 0 0.0 0:00.02 0:00 pickup
5306 postgres 16 0 29760 20 20 S 0 0.0 0:52.89 0:52 postmaster
5302 postgres 17 0 29628 64 32 S 0 0.0 1:00.64 1:00 postmaster
我尝试过将swappiness
内核参数调整为高值和低值,但似乎没有任何改变。我不知道发生了什么。我怎样才能找出导致这种情况的原因?
更新:该系统是完全 64 位系统,因此不应该存在由于 32 位问题而导致的内存限制问题。
更新2:正如我在原始问题中提到的,我已经尝试将 swappiness 调整为各种值,包括 0。结果总是一样的,大约有 1.6 GB 的内存未被使用。
更新3:在上述信息中添加了顶部输出。
答案1
Bacula 的性能高度依赖于数据库。很可能是 postgresql 导致您的服务器崩溃。高负载平均值和相当大比例的 CPU 等待时间清楚地表明它正在等待磁盘 I/O... 而这正是 PostgreSQL 的所作所为。对于备份集中的每个文件,它至少执行一个 UPDATE 语句。不必担心交换。
请调整 PostgreSQL 安装。可能要为各个数据库(甚至表)提供自己的磁盘/RAID 集以分散 I/O。如果尚未使用,您可以强制 PostgreSQL 使用异步写入...尽管这是以数据库完整性换取写入性能。尽可能增加 PostgreSQL 可用的共享内存。这至少会减轻数据库上的大量读取。如果您从未这样做过,请在 Bacula 数据库上运行 VACCUM ANALYZE,以便为查询优化器提供一些工作。
到目前为止,Bacula 最薄弱的环节是数据库依赖性(以及其中一些的脑死亡......)运行最近的大型备份清除,并注意运行几千万个查询需要多长时间(通常需要数小时)......Bacula 喜欢相对较少的大文件,否则它就是一只狗。
答案2
您受到 I/O 限制。 您的系统就像一艘小救生筏,在 100 英尺高的缓冲区/缓存/虚拟机分页浪潮中不断受创。
哇。真是……哇。你的 I/O 传输速度约为 100Mbyte/sec,I/O 等待时间已超过 50% 的 CPU 时间,并且有 4Gb 的 RAM。此服务器 VM 上的背压一定非常大。在“正常”情况下,当系统开始缓冲/缓存时,你拥有的任何可用 RAM 都将不到40秒就被活活吃掉。
是否可以发布设置从/proc/sys/vm
?这将提供一些关于您的内核认为什么是“正常”的见解。
这些postmaster
进程还表明您正在后台运行 PostgreSQL。这对于您的设置来说正常吗?默认配置下的 PostgreSQL 将使用很少的 RAM,但一旦重新调整速度,它就会很快占用 25%-40% 的可用 RAM。因此,鉴于输出中的数量,我只能猜测,您在运行备份的同时正在运行某种生产数据库。 这不是一个好兆头。 您能否提供更多有关其运行原因的信息?所有进程的共享内存参数的大小是多少postmaster
?是否可以关闭服务,或临时重新配置数据库以在备份运行时使用更少的连接/缓冲区?这将有助于减轻已经紧张的 I/O 和可用 RAM 的一些压力。请记住,每个 postmaster
进程消耗的 RAM 都超过数据库用于内部缓存的 RAM。因此,当您调整内存设置时,注意哪些是“共享的”,哪些是“每个进程的”。
如果您在备份过程中使用 PostgreSQL,请尝试重新调整它以接受只需最少数量的连接,并确保将每个进程的参数缩小到合理的范围(每个只有几兆)。这样做的缺点是如果 PostgreSQL 无法像它希望的那样处理 RAM 中的数据集,它将溢出到磁盘,因此这实际上增加你的磁盘 I/O,因此请谨慎调整。
X11 本身并不占用太多内存,但完整的桌面会话可能会占用几兆内存。注销所有活动会话并从控制台或通过 SSH 运行连接。
仍然,我认为这不完全是记忆问题。 如果你的 I/O 超过 50%,请等待较长时间(而且你发布的数字接近 70 年代的数字),由此产生的瓶颈最终会压垮系统的其余部分。就像达斯维达压碎脖子。
多少冲洗螺纹您的配置如何?使用
cat /proc/sys/vm/nr_pdflush_threads
找出并
echo "vm.nr_pdflush_threads = 1" >> /etc/sysctl.conf
将其设置为单线程。请注意,最后一个命令使其在重新启动时永久加载。看到 1 或 2 并不罕见。如果您有多个核心或大量的主轴/总线容量用于 I/O,您将需要(稍微)增加这些。更多的刷新线程 = 更多的 I/O 活动,但也会花费更多的 CPU 时间在 I/O 等待上。
这是默认值,还是您已将其调整过?如果已将其调整过,您是否考虑过减少该数字以减少 I/O 操作的压力?或者您是否有大量主轴和通道需要使用,在这种情况下,您是否考虑过增加刷新线程的数量?
PS:您需要将 swappiness 设置为较低的值,而不是较高的值,以防止交换。最高值 = 100 = 感觉合适时疯狂交换,最低值 = 0 = 尽量不交换。
答案3
如果您查看每秒读取的块数 (bi),IO 下交换活动的数量级就会大大高于此。我不认为交换使用量是导致磁盘抖动的原因,我认为您在机器上运行了某些程序,只是导致了大量磁盘活动(读取)。
我会调查正在运行的应用程序,看看你是否能找到罪魁祸首。
答案4
您可以尝试完全禁用交换吗?
swapoff /dev/hdb2
或类似的东西 - 至少这可以验证交换是你的问题,而不是其他问题。