您的位置:首页 > 运维架构 > Linux

Linux性能调优之虚拟内存篇

2010-06-26 08:07 369 查看
简单地说,虚拟内存就是硬盘中的一块区域,它用来存放内存里使用频率不高的页面文件。好处是为了提高内存的利用率 - 让使用频率高的页面文件活动在内存区域中,提高CPU对数据操作的速度。在Linux中,这个区域叫做swap,一般大小应设置为物理内存的2倍。

vm.swappiness是Linux内核的一个参数,范围是0~100。它表示实际内存和虚拟内存区域进行数据交换的倾向性大小,数值越大表示倾向性越大,即交换的页面文件越多,反之亦然。一般默认值为60。可用'cat /proc/sys/vm/swappiness’查看。

这个值应该设置成多大才能提高Linux的性能呢?这个当然要由具体的环境来定了。我在一台CentOS机器上,分别把值设为0,60,100,下面是运行'vmstat -S M 5’的三次数据报告。(vmstat命令是用来查看虚拟内存状况的,参数-S M表示以M为单位,5表示每5秒钟产生一次报告。)这里主要关注bi,bo和wa这三个值,bi代表每秒钟从硬盘读入数据的块数(因为硬盘是块设备),bo表示每秒钟写入硬盘数据的块数,wa表示CPU等待IO设备就绪的时间。

当值为0时:
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 0 1277 16 6340 0 0 7 3 1 1 0 2 91 6 0
2 0 0 1277 16 6340 0 0 9 778 1203 3901 0 5 78 17 0
0 1 0 1276 16 6340 0 0 4 510 1094 3855 0 1 96 2 0
0 0 0 1276 16 6340 0 0 13 294 1113 3896 0 3 89 7 0
2 0 0 1276 16 6340 0 0 12 462 1122 3954 0 2 96 2 0
0 0 0 1276 16 6340 0 0 8 6 1027 3915 0 1 98 0 0
0 2 0 1276 16 6340 0 0 19 982 1178 3894 0 2 79 19 0
0 0 0 1276 16 6340 0 0 10 666 1195 3904 0 3 70 27 0
0 0 0 1276 16 6340 0 0 7 10 1031 3955 0 2 98 0 0
0 0 0 1276 16 6340 0 0 15 9 1031 3902 0 5 95 0 0
2 2 0 1275 16 6341 0 0 7 1420 1275 3930 0 2 67 32 0
0 0 0 1275 16 6341 0 0 6 290 1125 3939 0 1 89 10 0
0 0 0 1275 16 6341 0 0 11 18 1029 3975 0 2 98 0 0
0 0 0 1275 16 6341 0 0 26 22 1037 3984 0 1 98 1 0
0 0 0 1275 16 6341 0 0 5 18 1027 3892 0 2 97 0 0
0 0 0 1275 16 6341 0 0 6 10 1029 3878 0 1 98 0 0
0 2 0 1275 16 6341 0 0 6 1106 1191 3935 0 1 81 18 0
1 2 0 1275 16 6341 0 0 18 1121 1245 3870 0 1 61 38 0
0 0 0 1275 16 6341 0 0 14 121 1086 3924 0 2 94 4 0
0 2 0 1274 16 6341 0 0 12 1264 1245 3925 0 1 73 25 0
1 0 0 1274 16 6342 0 0 8 777 1208 3897 0 4 74 22 0
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 0 1274 16 6342 0 0 8 267 1076 3870 0 5 95 0 0
0 0 0 1274 16 6342 0 0 6 391 1089 3856 0 2 98 0 0
0 0 0 1274 16 6342 0 0 10 0 1033 3893 0 1 98 0 0
2 0 0 1274 16 6342 0 0 5 0 1026 3904 0 2 98 0 0
0 2 0 1274 16 6342 0 0 5 1016 1193 3907 0 2 82 16 0
0 0 0 1274 16 6342 0 0 4 203 1092 3895 0 3 90 7 0
1 3 0 1274 16 6342 0 0 6 1198 1243 3910 0 2 75 23 0
2 0 0 1274 16 6342 0 0 4 81 1062 3974 0 1 95 3 0
1 0 0 1274 16 6342 0 0 14 13 1029 3907 0 1 98 0 0
0 2 0 1274 16 6342 0 0 11 1231 1228 3960 0 4 71 24 0
0 0 0 1274 16 6342 0 0 10 222 1102 3971 0 2 84 13 0
0 0 0 1273 16 6343 0 0 6 0 1032 3954 0 2 98 0 0
0 3 0 1273 16 6343 0 0 6 1411 1314 4007 0 3 69 28 0
0 0 0 1272 16 6343 0 0 14 386 1157 4162 0 2 91 7 0
1 0 0 1272 16 6343 0 0 14 810 1170 3921 0 1 89 10 0
2 0 0 1272 16 6343 0 0 5 566 1137 3884 0 1 92 6 0
0 0 0 1272 16 6343 0 0 10 265 1073 3938 0 2 98 0 0
0 0 0 1272 16 6343 0 0 54 802 1196 4131 0 7 83 9 0
0 0 0 1272 16 6344 0 0 7 7 1046 3939 0 2 98 0 0
0 0 0 1272 16 6344 0 0 4 943 1206 3840 0 1 86 12 0
2 0 0 1272 16 6344 0 0 9 38 1033 3891 0 1 99 0 0
当值为60时:
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 1 0 1268 17 6347 0 0 7 3 1 1 0 2 91 6 0
0 0 0 1267 17 6347 0 0 7 526 1163 3875 0 2 92 5 0
0 0 0 1267 17 6347 0 0 8 4 1025 3934 0 1 98 0 0
2 0 0 1267 17 6347 0 0 6 17 1032 3917 0 1 98 0 0
0 0 0 1267 17 6348 0 0 9 34 1036 3909 0 2 98 0 0
1 0 0 1267 17 6348 0 0 9 16 1033 3990 0 1 98 0 0
0 1 0 1267 17 6348 0 0 6 1172 1195 3936 0 3 83 14 0
0 0 0 1266 17 6348 0 0 12 958 1252 3988 0 3 64 33 0
1 0 0 1266 17 6348 0 0 32 372 1096 3875 0 1 97 2 0
0 0 0 1266 17 6348 0 0 7 4 1034 3838 0 1 98 0 0
0 0 0 1266 17 6348 0 0 13 18 1030 3925 0 2 98 0 0
0 1 0 1266 17 6348 0 0 4 1100 1200 3862 0 2 83 15 0
0 0 0 1266 17 6348 0 0 4 350 1139 3921 0 2 88 10 0
0 0 0 1266 17 6348 0 0 6 0 1028 3814 0 2 97 0 0
1 0 0 1266 17 6349 0 0 10 769 1179 3886 0 2 83 15 0
0 0 0 1266 17 6349 0 0 7 411 1100 4004 0 1 96 3 0
0 1 0 1266 17 6349 0 0 10 578 1118 3915 0 2 94 5 0
0 0 0 1266 17 6349 0 0 26 85 1077 3865 0 1 92 7 0
0 0 0 1266 17 6349 0 0 6 18 1029 3879 0 1 98 0 0
0 2 0 1265 17 6349 0 0 10 658 1116 3963 0 1 92 6 0
0 0 0 1265 17 6349 0 0 10 798 1212 3901 0 3 71 27 0
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1265 17 6349 0 0 10 245 1077 3900 0 1 98 1 0
0 0 0 1264 17 6350 0 0 37 13 1044 3925 0 2 97 1 0
0 0 0 1264 17 6350 0 0 6 848 1187 3892 0 2 83 15 0
0 3 0 1264 17 6350 0 0 6 577 1119 3920 0 1 93 5 0
1 0 0 1264 17 6350 0 0 4 84 1062 3890 0 1 96 2 0
0 0 0 1264 17 6350 0 0 10 18 1034 3824 0 2 97 0 0
0 0 0 1264 17 6350 0 0 6 0 1025 3931 0 1 98 0 0
0 1 0 1264 17 6350 0 0 10 621 1110 3891 0 2 94 4 0
1 0 0 1264 17 6350 0 0 8 466 1144 3855 0 2 77 21 0
0 0 0 1264 17 6350 0 0 8 8 1031 3916 0 1 98 0 0
1 0 0 1264 17 6350 0 0 8 12 1028 3914 0 1 98 0 0
1 2 0 1263 17 6351 0 0 10 929 1182 3962 0 3 85 12 0
2 1 0 1263 17 6351 0 0 10 1089 1275 3988 0 2 58 40 0
0 0 0 1263 17 6351 0 0 11 358 1142 3954 0 2 88 10 0
2 0 0 1263 17 6351 0 0 6 0 1026 3853 0 1 99 0 0
0 0 0 1263 17 6351 0 0 6 0 1029 3990 0 1 98 0 0
1 0 0 1263 17 6351 0 0 6 11 1029 3856 0 1 98 0 0
2 1 0 1263 17 6351 0 0 7 1276 1204 3885 0 3 80 18 0
1 0 0 1263 17 6351 0 0 14 514 1156 3849 0 2 77 21 0
0 1 0 1251 17 6353 0 0 393 736 1234 4059 2 2 85 11 0
当值为100时:
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 6 0 1202 18 6411 0 0 7 3 1 0 0 2 91 6 0
0 6 0 1201 18 6411 0 0 66 1153 1189 3604 0 3 45 53 0
1 3 0 1200 18 6412 0 0 189 930 1226 8164 1 8 49 41 0
0 6 0 1200 18 6412 0 0 44 1134 1261 3937 0 2 53 45 0
0 4 0 1200 18 6413 0 0 98 1118 1229 3868 0 2 46 52 0
2 3 0 1200 18 6413 0 0 45 1245 1251 3798 0 2 49 49 0
1 4 0 1199 18 6413 0 0 74 922 1218 3853 0 2 53 45 0
1 5 0 1198 18 6415 0 0 194 1084 1225 4919 0 4 51 44 0
0 3 0 1198 18 6415 0 0 52 930 1192 3577 0 3 51 45 0
1 0 0 1197 18 6416 0 0 147 831 1222 3995 0 13 51 36 0
1 1 0 1197 18 6416 0 0 48 3240 1256 4557 1 5 46 48 0
0 2 0 1196 18 6417 0 0 38 3730 1267 4536 0 5 53 42 0
1 2 0 1195 18 6417 0 0 42 3336 1238 4048 0 3 51 45 0
1 4 0 1195 18 6418 0 0 50 2759 1207 4237 1 5 52 42 0
0 7 0 1195 18 6418 0 0 48 2201 1229 4138 0 4 41 54 0
2 3 0 1194 19 6420 0 0 28 2360 1241 3913 0 2 53 44 0
0 4 0 1193 19 6420 0 0 63 3812 1209 4344 1 5 46 48 0
0 4 0 1193 19 6421 0 0 120 3942 1199 4452 1 5 43 52 0
0 3 0 1192 19 6421 0 0 38 2963 1231 4272 0 4 45 51 0
0 4 0 1191 19 6421 0 0 37 2784 1202 4373 1 5 49 46 0
1 4 0 1191 19 6421 0 0 24 2558 1242 3909 0 2 54 43 0
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 5 0 1191 19 6422 0 0 36 1774 1212 4009 0 4 47 50 0
0 2 0 1191 19 6422 0 0 29 4292 1208 4479 0 4 48 47 0
0 4 0 1191 19 6422 0 0 44 3392 1204 4705 1 5 45 49 0
1 2 0 1190 19 6423 0 0 56 3950 1250 4541 1 5 55 40 0
0 2 0 1190 19 6423 0 0 67 877 1198 3515 0 2 54 44 0
1 2 0 1189 19 6423 0 0 67 928 1201 3589 0 1 57 41 0
1 3 0 1189 19 6424 0 0 69 1488 1190 3569 0 2 50 49 0
0 3 0 1189 19 6424 0 0 61 2230 1228 3828 0 2 53 44 0
1 6 0 1189 19 6424 0 0 30 2662 1275 4186 0 3 38 58 0
3 2 0 1190 19 6424 0 0 22 1932 1274 4297 0 26 32 42 0
0 4 0 1190 19 6425 0 0 56 1692 1289 4160 0 10 46 44 0
1 0 0 1188 19 6427 0 0 412 795 1216 4795 0 13 56 31 0
0 2 0 1188 19 6427 0 0 127 1854 1298 4400 0 13 52 35 0
0 5 0 1187 19 6428 0 0 34 6174 1250 4808 0 11 45 44 0
0 3 0 1187 19 6428 0 0 110 1285 1218 3507 0 1 52 46 0
0 1 0 1185 19 6430 0 0 306 938 1215 3890 0 2 59 40 0
1 3 0 1185 19 6431 0 0 52 3722 1207 4013 0 2 57 41 0
0 4 0 1185 19 6431 0 0 17 9450 1205 5760 1 9 41 50 0
1 2 0 1184 19 6431 0 0 16 7072 1188 4330 0 4 55 41 0
2 4 0 1184 19 6431 0 0 20 7046 1241 5521 1 8 48 44 0
1 3 0 1183 19 6432 0 0 46 7037 1190 4488 0 8 37 54 0

发现什么了吗?很明显当值为100时,wa基本为50左右的值,这表示50%的CPU时间都在等待IO设备就绪(大好的CPU资源就这样被浪费了!)现在你明白瓶颈在哪里了吧?对,就是硬盘。说明我实验的这台机器硬盘IO的处理能力是最影响性能的了。那么该怎么解决呢?当然了,换个转速更快的硬盘当然可以,还有呢?增加内存有可能也可以。增加了内存以后,再把swappiness的值设小点,以减少硬盘IO的操作。内存够大时,无论页面文件的使用频率是高还是低都放在内存里,无须使用虚拟内存。

但是在这个例子中,swpd的值始终为0,这表示没有虚拟文件被使用。这说明内存容量是足够的,即使再增加内存,作用也不大。最好的办法就是更换硬盘了。

如何改变swapiness的值?你可以运行'echo 数值 > /proc/sys/vm/swapiness’ 或者 'sysctl –w vm.swappiness = 数值' 来修改内核中的实时参数。如果想机器在重启之后仍然保持这个数值的话,就需要在'/etc/sysctl.conf’文件中加上'vm.swappiness = 数值' 这一行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: