Linux kernel 性能优化(四)虚拟内存

虚拟内存使用磁盘作为RAM的扩展,从而有效的增加内存的使用率。内核会把当前未使用的内存块内容写到硬盘中去,让内存可以有其他用户。当原来的内容需要的时候,再重新读回内存。这个对用户来说是完全透明的;Linux下运行的程序只看到大量可用的内存而不会注意到其中有一些内存是暂存在磁盘中。当然,读写硬盘比使用内存要蛮,所以程序速度就受影响。作为虚拟内存使用的磁盘空间被称做交换空间。


4.1 虚拟内存页

虚拟内存被分成页面。在X86上的每一个虚拟内存页都是4KB。当内核从磁盘读写内存的时候,都以页为单位。内核会将内存写回交换设备和文件系统。


4.2 虚拟大小(VSZ) 和驻留集大小 (RSS)
当一个应用开始运行时,它会请求虚拟内存(VSZ)。内核或者批准或拒绝虚拟内存请求。当应用使用请求内存时,内存会被映射到物理内存。RSS是被物理映射到内存中的虚拟内存总量。大部分情况下,一个应用实际使用的驻留集内存(RSS)会少于它请求的内存(VSZ)。以下从ps命令的输出显示了VSZ和RSS的值。在所有情况下,VSZ都比RSS大。这个意味着虽然一个应用请求虚拟内存,不是所有都会在RAM里被分配(RSS)
# ps –aux
USER PID %CPU %MEM   VSZ RSS  TTY STAT START TIME COMMAND
<snip>
daemon 2177 0.0 0.2 3352 648  ?   Ss 23:03 0:00 /usr/sbin/atd
dbus 2196 0.0 0.5  13180 1320 ?   Ssl 23:03 0:00 dbus-daemon-1 --sys
root 2210 0.0 0.4   2740 1044 ?   Ss 23:03 0:00 cups-config-daemon
root 2221 0.3 1.5   6108 4036 ?   Ss 23:03 0:02 hald
root 2231 0.0 0.1   2464 408 tty1 Ss+ 23:03 0:00 /sbin/mingetty tty1
root 2280 0.0 0.1   3232 404 tty2 Ss+ 23:03 0:00 /sbin/mingetty tty2
root 2343 0.0 0.1   1692 408 tty3 Ss+ 23:03 0:00 /sbin/mingetty tty3
root 2344 0.0 0.1   2116 404 tty4 Ss+ 23:03 0:00 /sbin/mingetty tty4
root 2416 0.0 0.1   1476 408 tty5 Ss+ 23:03 0:00 /sbin/mingetty tty5
root 2485 0.0 0.1   1976 408 tty6 Ss+ 23:03 0:00 /sbin/mingetty tty6
root 2545 0.0 0.9  10920 2336 ? Ss 23:03 0:00 /usr/bin/gdm-binary

4.3 页映射和交换
页映射和交换是两个内核根据系统负载而做出的不同行为。系统页面交换是一个正常的活动。内存页面是对交换设备和文件系统读写的,如果系统内存低,内核将试图首先尝试将页面写入交换设备来释放RAM。如果内核无法释放足够的内存,将会开始交换整个进程。而页面交换只针对单独的内存页,swapping是将特定进程相关的整个内存区域都写入交换设备中。

4.4 用pdflush & kswapd进行内核paging
有两个守护进程是用来同步内存,当内存页面被运行的进程修改了,就变成了'dirty'(脏页),这些页必须被写回磁盘或者交换设备。

4.4.1 pdflush
守护进程pdflush使用将文件系统上的一个文件相关的页面同步回磁盘。换句话说,当一个文件在内存中被修改,pdflush就将其写回磁盘。
# ps -ef | grep pdflush
root 28 3 0 23:01 ? 00:00:00 [pdflush]
root 29 3 0 23:01 ? 00:00:00 [pdflush]
当内存中有10%的页面变成脏页时,pdflush就会将其写回文件系统。这是由于内核的优化参数vm.dirty_background_ratio决定的.
# sysctl -n vm.dirty_background_ratio

4.4.2 kswapd
守护进程kswapd是在内存短缺的时候用来释放空闲内存的。如果一个可利用的系统内存页低于一个最小空闲阈值,那么kswapd将会开始扫描内存页。它将会有以下动作:
•如果页没有被修改,将会被放在空闲链表。
•如果页被修改并且已经被写回某个文件系统,那么就会将内容写回磁盘。
•如果页被修改但是没有被写回任何文件系统,那么就会将内容写入一个交换设备。
# ps -ef | grep kswapd
root 30 1 0 23:01 ? 00:00:00 [kswapd0]

4.5 案例分析:大量未绑定IO
vmstat工具会显示CPU和虚拟内存的使用率,以下vmstat的输出域是和虚拟内存相关的:

Swapd:当前使用的虚拟内存总量。当空闲内存到达低阈值时,更多的数据会被映射到交换设备。
Free:可用来运行应用的物理RAM的总量。
Buff:在read(), write()操作后,缓冲区中物理内存的总量。
Cache:映射到进程地址空间的物理内存总量。
so:交换磁盘的数据总量。
si:从交换磁盘写入RAM的数据总量。
Bo:从RAM中调出到文件系统或者交换设备的磁盘块数。
Bi:从文件系统或者交换设备调入到RAM的磁盘块数目。

下面这个vmstat输出证明了一个I/O应用spike大量地使用了虚拟内存。
# vmstat 3
procs         memory             swap        io       system        cpu
r b swpd   free   buff  cache   si  so   bi    bo    in   cs   us sy id wa
3 2 809192 261556 79760 886880  416 0    8244  751   426  863  17 3  6  75
0 3 809188 194916 79820 952900  307 0    21745 1005  1189 2590 34 6  12 48
0 3 809188 162212 79840 988920  95  0    12107 0     1801 2633 2  2  3  94
1 3 809268 88756  79924 1061424 260 28   18377 113   1142 1694 3  5  3  88
1 2 826284 17608  71240 1144180 100 6140 25839 16380 1528 1179 19 9  12 61
2 1 854780 17688  34140 1208980 1   9535 25557 30967 1764 2238 43 13 16 28
0 8 867528 17588  32332 1226392 31  4384 16524 27808 1490 1634 41 10 7  43
4 2 877372 17596  32372 1227532 213 3281 10912 3337  678  932  33 7  3  57
1 2 885980 17800  32408 1239160 204 2892 12347 12681 1033 982  40 12 2  46
5 2 900472 17980  32440 1253884 24  4851 17521 4856  934  1730 48 12 13 26
1 1 904404 17620  32492 1258928 15  1316 7647  15804 919  978  49 9  17 25
4 1 911192 17944  32540 1266724 37  2263 12907 3547  834  1421 47 14 20 20
1 1 919292 17876  31824 1275832 1   2745 16327 2747  617  1421 52 11 23 14
5 0 925216 17812  25008 1289320 12  1975 12760 3181  772  1254 50 10 21 19
0 5 932860 17736  21760 1300280 8   2556 15469 3873  825  1258 49 13 24 15
根据以上输出可以得出下面的结论:
•大量的磁盘块从文件系统里被调入(bi)。进程地址空间的数据缓存(cache)不断增长就是证据。
•在这个时期,空闲内存的总量稳定地保持在17MB (free),哪怕数据从磁盘调入消耗了空闲的RAM。
•为了维持空闲链表,kswapd从read/write 缓冲区‘偷’了内存并指派给空闲链表。这从逐渐下降的缓冲区 (buff)就可以看出来。
•kswapd进程接下来就将脏页写回交换设备(so)。这个从虚拟内存的利用率不断提高(swpd)就能看出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值