我们拥有一批网络托管服务器,全部运行完全相同的软件和硬件,并且负载相似。
我们的一台服务器负载非常高,导致其短时间内锁定。这台服务器的主要区别似乎是交换使用率非常高,即使有大量可用 RAM 且交换量设置为 30:
# cat /proc/sys/vm/swappiness
30
# free -m
total used free shared buff/cache available
Mem: 40074 8277 6352 548 25444 29412
Swap: 24575 5814 18761
Top 显示了类似的内存使用情况和空闲负载的概念:
# top
Tasks: 529 total, 6 running, 520 sleeping, 0 stopped, 3 zombie
%Cpu(s): 51.1 us, 11.8 sy, 0.0 ni, 35.2 id, 1.6 wa, 0.0 hi, 0.3 si, 0.0 st
KiB Mem : 41035828 total, 6511476 free, 8697564 used, 25826788 buff/cache
KiB Swap: 25165820 total, 19224744 free, 5941076 used. 29916408 avail Mem
我认为可能存在问题的原因是 vmstat 显示交换使用率较高
# 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
10 0 5856556 4559436 724880 26904888 3072 20 26392 1624 30378 10346 30 22 40 4 5
12 1 5856444 4646072 725168 26902376 5344 80 19344 5548 25937 8049 18 30 45 4 4
17 0 5856608 4668964 717648 26875160 4772 164 17316 3300 31929 7187 19 53 19 5 5
10 1 5856780 4752916 704900 26836828 3768 172 17748 904 30300 7699 22 59 15 2 1
2 3 5856788 4623292 708248 26859896 4768 8 34496 1972 30090 15300 25 19 51 4 1
11 0 5856792 4726972 709364 26876620 6732 4 39812 3796 26562 12241 20 27 50 3 0
12 1 5856832 4749100 710604 26842904 9000 40 19136 1128 26507 9283 25 41 32 2 0
4 0 5856504 4859128 712020 26826680 7516 172 23524 2580 24394 10530 19 37 41 3 0
11 1 5856372 4791056 709808 26828772 11136 8 23860 2264 19609 12320 13 22 61 4 0
7 0 5856372 4634432 713320 26852572 8744 0 37992 1028 23425 12326 18 21 56 4 0
8 1 5856368 4530268 715848 26854832 5592 0 26272 2996 34327 14391 24 23 49 3 1
7 0 5856376 4611928 714176 26902960 7044 8 45588 2984 32832 10172 26 25 45 3 0
11 0 5856408 4645736 712716 26914004 8164 32 19692 7160 23702 16326 21 21 54 2 1
8 0 5856412 4658252 715648 26907004 6608 8 28260 1608 31679 10715 23 19 54 3 1
7 0 5855264 4495904 718876 26929968 6288 0 31232 968 23048 9080 24 11 59 5 0
4 0 5853560 4796052 719268 26938096 2148 0 18764 1556 21659 8297 15 14 69 2 0
4 2 5852116 4692844 720656 26952300 2212 0 16764 636 18181 10162 18 9 71 2 0
9 0 5850960 4566112 720756 26977948 3120 0 33116 5136 24373 7915 23 12 64 1 0
9 0 5850316 4626320 721260 26962468 2400 148 13988 484 24208 6748 21 34 43 1 0
我们有另一台服务器,在负载和用户数量方面可能最接近它,它们都具有相同的硬件和软件,而另一台服务器的用户甚至更多,并且 CPU 使用率通常也更高,尽管只是略高。它始终使用明显更少的交换空间,它的 free -m & vmstat 看起来像:
other# free -m
total used free shared buff/cache available
Mem: 40073 9471 4376 2408 26226 27210
Swap: 28671 3490 25181
other# vmstat 1
10 0 3564112 4904700 1227052 25172336 0 44 19672 896 23057 3955 23 16 61 0 0
3 0 3564148 4837896 1226772 25168380 0 36 3080 15000 29370 4467 19 15 65 1 0
9 0 3564204 4829296 1226612 25222808 0 56 46632 2100 16596 5268 11 15 73 1 0
5 0 3564248 4663528 1226424 25328292 0 44 95104 1072 34862 6531 25 15 59 1 0
6 1 3564296 4566072 1226924 25390092 0 48 55632 2056 35307 12050 15 16 68 2 0
4 0 3564332 4496940 1226620 25391812 0 36 5772 1364 37957 4805 18 15 67 1 0
5 0 3564348 4651396 1226552 25388820 0 16 2160 2004 14545 3504 12 11 76 0 0
4 0 3564368 4809568 1225696 25331324 0 20 1524 700 11572 2997 7 10 83 0 0
3 0 3564404 4802060 1223488 25328372 0 44 2160 2328 21654 11113 14 14 72 0 0
3 0 3563960 4831720 1220844 25285840 296 16 1304 2120 16522 4083 11 11 77 0 0
5 0 3563972 4805272 1217784 25289068 0 12 6920 1060 22775 4271 17 12 71 0 0
3 0 3563980 4758120 1214556 25293184 0 8 5560 7896 30875 5421 22 13 63 0 1
4 0 3563988 4687848 1211544 25293100 28 8 3288 828 24343 4136 16 12 71 0 0
7 0 3564040 4474796 1204748 25299556 0 52 7908 1608 37724 6343 23 17 58 1 1
3 0 3564072 4507772 1201608 25324032 0 32 26724 2536 33578 7815 22 16 61 1 0
6 0 3564076 4709044 1198596 25327624 8 8 7016 928 29711 5099 19 13 67 1 0
从顶部查看时,它显示 systemd 每天使用大约 968GB 的磁盘读取量,而另一台服务器每天使用大约 520GB 的磁盘读取量。我将此归因于 swap,但 swap 会显示在该统计数据下吗?
我知道与其他服务器相比,这台服务器的性能较差,而且锁定似乎与之有关,尽管很难说,因为当它锁定时,我们无法进入,我们的日志记录也会失败。
我希望找到一种方法来找出为什么这台服务器使用交换空间如此之多。
编辑:从 Atop 添加图像以显示页面扫描/停顿和换入换出 顶部显示页面扫描
答案1
首先,您几乎肯定不会在这里进行交换 - 而是进行分页。分页是一个不同的过程,它使用与交换相同的存储,但它是主动的,而不是纯粹对内存状况的反应。
如果您看到更多分页,那将是因为您的工作负载与硬件设置有关。监控每秒的工作负载操作数(或类似指标)将揭示其中的任何不一致之处。根据您的负载平衡工作方式,您可能有一个“粘性”客户端,它要求此特定服务器承担高负载 - 但这只是猜测。
其次,如果这些服务器都具有相同的硬件配置,那么您应该期望它们在相同负载下几乎完全相同地运行。如果您的负载确实平衡,那么运行一些硬件诊断将是明智之举。首先关注磁盘和网络 I/O,因为几乎没有故障的磁盘或 NIC 会将平均负载和相关内存使用量推高,因为硬件会占用重试时间等。
尽管您提供了数据,但这个问题确实很广泛,很难准确回答。发布工作量和硬件诊断信息的结果将有助于提供更具体的答案,即使不能回答问题本身。
答案2
我在一台物理服务器上看到了类似的情况,开发人员使用内部驱动器来存储操作系统和数据。据我所知,我们有一个间歇性过度工作的根磁盘(交换所在的位置)+一个通常已满的缓冲区缓存,然后有东西进来了,需要分配一些内存。
看起来要么需要交换来释放缓冲区缓存页面,要么需要接触位于同一设备上的文件...由于它无法足够快地清除内存页面,我认为它开始交换东西,从而导致恶性循环...我没有任何数字来支持这一点,但根据我的经验,当你超过配置的 IOPS 时,下降要比仅仅过度使用本地连接的旋转磁盘要突然得多...仔细查看设备上交换的 IO。