在网上看到很多文章都在说交换内存的设置公式,然而我却不明白为什么要这么设置。交换内存是用于当物理内存不足时,将硬盘一部分存储当作内存来使用,众所周知,内存速度和硬盘速度不是一个量级的。当交换内存远大于物理内存时,“交换”将消耗大量的IO,最终导致系统成不可用状态。
交换内存设置表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
RAM(MB) No hibernation With Hibernation Maximum
256 256 512 512
512 512 1024 1024
1024 1024 2048 2048
RAM(GB) No hibernation With Hibernation Maximum
1 1 2 2
2 1 3 4
3 2 5 6
4 2 6 8
5 2 7 10
6 2 8 12
8 3 11 16
12 3 15 24
16 4 20 32
24 5 29 48
32 6 38 64
64 8 72 128
128 11 139 256
|
服务器配置信息
我有一台服务器,是 (2C,1G) 的,充当玩具,性能对我来说,不太卡顿即可。我将虚拟内存扩充到8G,我测试下,极限8G,服务器功能是否还正常。
阶段一
主要是启动docker容器,目前已经部署了6个
1
|
docker run -d -p 3006:3000 metabase/metabase
|
1
2
3
4
|
work@dodov:~$ free -h
total used free shared buff/cache available
Mem: 981Mi 829Mi 63Mi 1.0Mi 88Mi 43Mi
Swap: 8.0Gi 3.6Gi 4.4Gi
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
work@dodov:~$ vmstat 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 3768788 63056 1768 105964 201 133 409 257 212 102 2 1 96 0 0
0 0 3769948 79620 1456 86660 40374 3102 40550 3102 8772 18201 9 28 37 23 4
1 0 3769692 78044 1468 87848 180 0 794 26 604 1120 3 1 93 1 2
3 0 3769436 77320 1468 88496 180 0 462 0 614 1119 3 2 92 1 3
1 2 3769068 85424 488 76440 35714 1980 38084 1980 8914 19889 7 28 40 21 4
0 0 3773860 72068 432 76732 33324 4628 45138 4732 9686 19808 14 31 28 24 3
0 0 3773348 66600 528 82452 412 0 3322 0 814 1410 3 2 92 2 2
0 0 3780272 74500 508 87972 1318 3978 7880 4018 1457 2445 6 4 83 3 4
2 1 3781112 69772 644 87836 15334 2006 17140 2010 4221 9283 4 14 67 10 5
1 0 3801412 67120 608 76812 38858 11870 39434 12020 11162 23234 10 35 1 46 8
0 0 3806960 71364 664 95416 3282 4286 14936 4334 2038 3575 4 9 78 7 3
0 0 3806192 61568 664 100552 974 0 3538 0 902 1734 4 3 90 2 1
0 0 3812808 79968 664 98404 512 3562 1190 3676 773 1342 2 3 93 1 1
0 0 3812040 75684 664 98412 1370 0 1374 0 807 1758 1 3 93 1 2
0 0 3811016 70424 664 98400 1452 0 1452 0 898 1848 3 2 93 1 1
0 0 3810504 69636 680 98664 258 0 372 52 703 1411 2 1 96 0 1
0 0 3810504 68660 1212 98732 50 0 348 0 555 1029 3 1 93 0 3
0 0 3810504 68628 1220 98720 22 0 22 26 510 1025 2 1 96 0 1
0 0 3810248 68156 1220 98784 156 0 168 0 548 1104 2 1 95 0 2
0 0 3809992 68124 1220 98780 104 0 104 0 557 1140 2 1 97 0 1
0 0 3809480 66896 1236 98788 572 0 572 42 803 1526 2 2 95 1 1
0 1 3809224 65164 1236 98828 474 0 488 0 631 1260 3 1 94 1 1
0 0 3808712 64092 1244 99268 254 0 464 28 597 1197 3 1 94 0 2
0 0 3808456 63368 1244 99232 274 0 274 0 533 1071 2 1 96 0 1
0 0 3808200 62076 1244 99268 596 0 596 0 709 1548 2 1 95 1 1
0 0 3810984 74556 1248 96444 1340 1870 1486 1906 1035 1989 3 4 88 4 1
0 0 3810728 66804 2504 102852 358 0 4174 0 748 1350 3 3 92 1 2
0 0 3809960 65480 2512 102904 494 0 494 32 643 1242 2 1 96 0 1
0 0 3809704 65260 2512 103116 150 0 266 86 545 1080 2 1 96 0 1
0 0 3809704 64220 2512 103332 214 0 314 0 601 1201 1 2 96 0 1
|
阶段二
再加一个,在服务器的后台查到IOPS读已经达到了50Mbps/s了
1
|
docker run -d -p 3007:3000 metabase/metabase
|
1
2
3
4
|
work@dodov:~$ free -h
total used free shared buff/cache available
Mem: 981Mi 812Mi 68Mi 1.0Mi 99Mi 51Mi
Swap: 8.0Gi 4.0Gi 4.0Gi
|
阶段三
已经启动到第十个了
1
2
3
4
|
work@dodov:~$ free -h
total used free shared buff/cache available
Mem: 981Mi 786Mi 100Mi 1.0Mi 93Mi 82Mi
Swap: 8.0Gi 5.0Gi 3.0Gi
|
貌似有点快扛不住了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
work@dodov:~$ vmstat 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 5119212 60124 2908 73884 260 185 499 314 12 146 2 1 96 1 0
1 0 5155220 75324 3376 94224 1520 19544 14760 19606 4138 3414 4 13 75 7 2
0 0 5154452 74096 3908 94660 298 0 792 0 764 1530 2 1 96 0 1
0 0 5177536 78392 3668 97028 3446 14728 6424 14766 2743 3810 15 12 63 10 1
2 2 5152432 73284 2396 81296 24644 11270 26372 11480 9063 15522 6 24 57 12 2
0 0 5139892 61932 1664 81592 11460 4734 16178 4804 4186 7736 6 14 70 9 1
1 0 5177700 94216 1916 91476 356 19256 10052 19432 2545 2223 3 10 82 3 1
5 0 5147428 68192 1792 90704 17006 382 18850 446 4116 9416 4 14 74 6 1
1 0 5144804 63024 1796 94800 11590 9828 15352 9946 5561 8727 9 15 53 21 2
0 0 5144292 62332 1796 94996 336 0 424 0 795 1585 3 2 94 0 1
0 0 5143012 59720 2200 95744 586 0 1154 0 832 1743 3 1 94 1 2
1 0 5147044 71256 1952 88356 1784 3676 3400 3884 1604 2822 4 6 85 3 2
1 0 5141924 62976 1952 90736 2628 0 3812 0 1623 2930 3 3 90 3 1
0 0 5167424 89004 1920 84096 2070 14930 3112 15092 2454 3112 3 10 82 5 1
0 0 5166656 88248 1920 84428 406 0 570 0 807 1586 3 2 93 0 1
0 1 5151296 69852 1920 85524 7648 0 8192 0 2820 6528 3 9 51 34 2
1 1 5159880 79004 1724 82588 8130 12100 9970 12162 4509 7477 6 12 37 43 2
2 1 5149128 66436 1724 82548 6292 0 6292 0 3330 4899 3 8 43 43 2
0 0 5145112 67056 1592 79028 9530 5800 10330 6002 3360 5822 3 10 63 22 2
1 1 5143576 65292 1668 78976 836 0 872 0 970 1944 3 2 94 1 1
1 0 5151016 73140 1656 78032 1886 5508 2514 5630 1812 2829 3 5 87 4 2
0 0 5149992 66336 1672 85960 406 0 4370 70 1045 1946 2 2 92 1 2
|
阶段四
扛不住了扛不住了,cpu经常性的飙100%,系统也卡顿严重了。
1
2
3
4
|
work@dodov:~$ free -h
total used free shared buff/cache available
Mem: 981Mi 799Mi 80Mi 1.0Mi 101Mi 60Mi
Swap: 8.0Gi 5.8Gi 2.2Gi
|
1
2
3
4
5
6
7
8
9
10
|
work@dodov:~$ vmstat 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
15 9 6038828 69424 2468 98080 274 202 527 334 20 157 2 1 95 1 0
9 15 6025196 64804 2392 90328 22348 15200 33226 19556 12588 19423 10 32 0 56 2
0 16 6023244 63616 1344 89936 12070 11056 16376 11968 9198 13661 7 19 0 72 2
7 19 6026188 62840 928 90600 13742 15552 18348 18354 9982 15065 12 21 0 66 1
21 6 6036792 70836 744 87876 14026 18614 20084 20208 12157 18162 9 24 0 65 2
1 17 6058080 72168 1092 96804 13226 23642 24766 23990 14056 23795 11 29 0 59 1
4 12 6071048 76688 1824 93440 12736 18720 15984 18800 11871 22269 9 23 0 65 2
|
结论
收工了。结论是8G确实太高了,当交换内存为将近6G时,系统已经达到了几乎一个极限的状态,正常的指令已经卡顿到不能获取CPU去执行。接下来,我要将交换内存变更成了4G,在这一区间,各方面能达到一个均衡的状态,况且5G内存也足够使用了,正常状态下用不了那么多。