1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > Linux性能优化-内存的swap

Linux性能优化-内存的swap

时间:2019-12-09 21:37:48

相关推荐

Linux性能优化-内存的swap

目录

Swap原理

NUMA和swap

swappiness

创建swap

一个swap的例子

参考

内存不足的情况

1.内存回收

2.OOM杀死进程

内存紧张导致的OOM,是指系统杀死占用大量内存的进程,释放这些内存,再分配给其他更需要的进程

内存回收,就是系统释放掉可以回收的内存,比如cache和buffer,就是属于可回收内存,他们在内存管理中,通常叫 文件页(File-backed Page)

大部分文件页,都可以直接回收,以后有需要再从磁盘重新读取就可以了,而那些被应用程序修改过,暂时还没有写入磁盘的数据(脏页),就需要先写入磁盘,才能再进行内存释放

脏页的写入方式包括

1.在应用程序中,调用fsync,把脏页同步到磁盘中

2.也可以交给系统,由内核线程pdflush负责将这些脏页刷新

除了buffer和cache,通过内存映射获取的文件映射页,也可以被释放掉,下次再访问的时候,从文件中重新读取就可以了

应用程序动态分配的堆内存,也就是内存管理中的 匿名页(Anonymous Page),这些不能直接回收

Linux是通过swap机制,将这些匿名页中的内存先写到磁盘中,再释放掉这些内存,给其他更需要的进程使用,再访问这些内存时,重新从磁盘读取内存就可以了

Swap原理

其原理是把一块磁盘空间或者一个本地文件,当内存来使用

1.换出,就是把进程暂时不用的内存数据存储到磁盘中,并释放掉这些数据占用的内存

2.换如,进程再次访问这些内存的时候,把他们从磁盘读到内存中来

swap其实是把系统的可用内存变大了,即使服务器的内存不足时,也可以运行大内存的应用程序

即使现在内存便宜了也大了,但是再大的内存也有不够用的时候

比如当内存不足时,有些应用程序并不想被OOM杀死,而是希望能缓一段时间,等待人工介入,或者等系统自动释

放其他进程的内存,再分配给他

笔记本的快速开机和休眠,就是基于swap,休眠时把系统的内存存入磁盘,等再次开机时就从磁盘中加载内存,

省去了很多应用初始化的过程,加速了开机速度

Linux什么时候回收内存呢?

比如有新的大块内存分配请求时,剩余内存不足,这时候系统就需要回收一部分内存(比如cache和buffer_,尽可

能的蛮族新内存请求,这个过程通常被称为 直接内存回收

除了直接内存回收,还有一个专门的内核线程用来定期回收内存,也就是 kswapd0,为了衡量内存的使用情况,

kswapd0定义了三个内存阈值(watermark 也称水位),分别是

页最小阈值(pages_min),页低阈值(pages_low),页高阈值(pages_high),剩余内存,则使用pages_free表示

kswap0定期扫描内存使用情况,并根据剩余内存落在这三个阈值的空间位置,进行内存回收操作

1.剩余内存小于 页最小阈值,说明进程可用内存都耗尽了,只有内存才可以分配内存

2.剩余内存落在 页最小阈值 和 页低阈值中间,说明内存压力比较大,剩余内存不多了,kswapd0会执行内存

回收,直到剩余内存大于高阈值为止

3.剩余内存落在 页低阈值 和页高阈值中间,说明内存有一定压力,但还可以满足新内存请求

4.剩余内存大于 页高阈值,说明剩余内存比较多,没有哦内存压力

一旦剩余内存小雨页低阈值,就会触发内存的回收,这个页低阈值,可以通过内核选项

/proc/sys/vm/min_free_kbytes

来设置,而其他两个值,都是根据页低阈值,直接计算生成的

page_low = pages_min * 5/4pages_high = pages_min * 3/2

NUMA和swap

有时候系统的剩余内存还很多,但还是发生了swap

这是因为处理器的NUMA(Non-Uniform Memory Access)架构导致的

在NUMA架构下,多个处理器被划分到不同Node上,且每个Node都拥有自己的本地内存空间

而同一个Node内部的内存空间,实际上又可以进一步分为不同的内存域(Znode),比如直接内存访问区(DMA),普通内存区(NORMAL),伪内存区(MOVABLE)等,如下图所示

通过numactl命令,可以查看处理器在Node的分布情况,以及每个Node的内存使用情况

numactl --hardwareavailable: 2 nodes (0-1)node 0 cpus: 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38node 0 size: 65442 MBnode 0 free: 16721 MBnode 1 cpus: 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39node 1 size: 65536 MBnode 1 free: 30760 MBnode distances:node 0 1 0: 10 21 1: 21 10

通过 cat /proc/znoeinfo 查看信息

Node 0, zoneDMA pages free3933min2 low2 high3 scanned 0spanned 4095present 3835nr_free_pages 3933nr_inactive_anon 0nr_active_anon 0nr_inactive_file 0nr_active_file 0nr_unevictable 0nr_mlock0 nr_anon_pages 0nr_mapped 0 nr_file_pages 0nr_dirty0 nr_writeback 0nr_slab_reclaimable 0nr_slab_unreclaimable 0nr_page_table_pages 0nr_kernel_stack 0nr_unstable 0nr_bounce 0 nr_vmscan_write 0nr_writeback_temp 0nr_isolated_anon 0nr_isolated_file 0nr_shmem0 numa_hit0 numa_miss 0 numa_foreign 0numa_interleave 0numa_local 0 numa_other 0 nr_anon_transparent_hugepages 0protection: (0, 1882, 64502, 64502)pagesetscpu: 0count: 0high: 0batch: 1vm stats threshold: 12cpu: 1。。。

比较重要的指标有

pages处的min,low,high,就是上面提到的三个内存阈值,free是剩余内存页数,跟后面的nr_free_pages相同

nr_zone_active_anon和nr_zone_inactive_anon,分别是活跃和非活跃的匿名页数

nr_zone_active_file和nr_zone_inactive_file,分别是活跃和非活跃的文件页

如果此时的剩余内存大于页高阈值,kswapd0就不会回收内存

如果某个Node内存不足,系统可以从其他Node寻找空闲内存,也可以从本地内存中回收内存,具体用哪种模式,通过下面参数来调整

/proc/sys/vm/zone_reclaim_mode

支持以下几个选项

默认的0,就是刚刚提到的模式,可以从其他Node寻找空闲内存,也可以从本地回收内存

1,2,4都表示只回收本地内存,2表示可以回写脏数据回收内存,4表示可以用Swap方式回收内存

swappiness

内存回收机制,即包括了文件页,也包括了匿名页

1.对于文件的回收,就是直接回收缓存,或者把脏页写回到磁盘再回收

2.对于匿名页,就是通过swap机制,把他们写入到磁盘后再释放内存

Linux系统提供了下面这个参数,可以用来调整使用swap的积极程度

/proc/sys/vm/swappiness

swappiness的范围是0-100,数值越大,越积极使用swap,也就是更倾向于回收匿名页

数值越小,越消极使用swap,也就是更倾向于回收文件页

swappiness的范围是0-100,但并不是内存的百分比,而是调整swap积极度的权重,即使把他设置成0,还是可会发生swap

创建swap

输入 free

freetotal used freeshared buff/cache availableMem: 4039480 701003000168 27889692123737268Swap: 0 0 0

Swap大小为0,说明没有配置Swap

Linux支持两种类型的Swap,Swap分区 和 Swap文件

下面是配置Swap文件的列子

fallocate -l 8G /mnt/swapfilefile /mnt/swapfilechmod 700 /mnt/swapfile mkswap /mnt/swapfile Setting up swapspace version 1, size = 8 GiB (8589930496 bytes)no label, UUID=92e57c51-23e6-4976-acc4-e0745c870bb7swapon /mnt/swapfile file swapfile swapfile: Linux/i386 swap file (new style), version 1 (4K pages), size 2097151 pages, no label, UUID=92e57c51-23e6-4976-acc4-e0745c870bb7

再输入free

total used freeshared buff/cache availableMem: 4039480 727202996780 27889699803734636Swap: 8388604 08388604swapoff -a #停止所有的swap分区

通过cat查看

cat /proc/swaps Filename Type Size Used Priority/mnt/swapfile file 2097148 0 -2

一个swap的例子

当设置swappiness为0的时候

cat /proc/sys/vm/swappiness 0

sar的swap和内存相关的man结果

#内存使用情况-rReport memory utilization statistics. The following values are displayed:kbmemfreeAmount of free memory available in kilobytes.kbmemusedAmount of used memory in kilobytes. This does not take into account memory used by the kernel itself.%memusedPercentage of used memory.kbbuffersAmount of memory used as buffers by the kernel in kilobytes.kbcachedAmount of memory used to cache data by the kernel in kilobytes.kbcommitAmount of memory in kilobytes needed for current workload. This is an estimate of how much RAM/swap is needed to guarantee that there neveris out of memory.%commitPercentage of memory needed for current workload in relation to the total amount of memory (RAM+swap). This number may be greater than 100%because the kernel usually overcommits memory.kbactiveAmount of active memory in kilobytes (memory that has been used more recently and usually not reclaimed unless absolutely necessary).kbinactAmount of inactive memory in kilobytes (memory which has been less recently used. It is more eligible to be reclaimed for other purposes).kbdirtyAmount of memory in kilobytes waiting to get written back to the disk.#交换分区使用情况-SReport swap space utilization statistics. The following values are displayed:kbswpfreeAmount of free swap space in kilobytes.kbswpusedAmount of used swap space in kilobytes.%swpusedPercentage of used swap space.kbswpcadAmount of cached swap memory in kilobytes. This is memory that once was swapped out, is swapped back in but still also is in the swap area(if memory is needed it doesn't need to be swapped out again because it is already in the swap area. This saves I/O).%swpcadPercentage of cached swap memory in relation to the amount of used swap space.

sar -r 一些内存参数说明

kbcommit,表示当前系统负载需要的内存,实际上是为了保证系统内存不溢出,对需要内存的估计值

kbactive,表示活跃内存,也就是最近使用过的内存,一般不会被系统回收

kbinact,表示非活跃内存,也就是不常访问的内存,有可能会被系统回收

执行dd

dd if=/dev/vda1 of=/dev/null bs=1G count=100

执行命令观察结果

sar -r -S 1 kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty3915640 3814304 1238403.07220025356 2273161.831707248604 96kbswpfree kbswpused %swpused kbswpcad %swpcad8388604 00.00 00.00kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty3049236 3309968 99024424.51 43612425432 127826010.29 448640 482532 96kbswpfree kbswpused %swpused kbswpcad %swpcad8388604 00.00 00.00kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty1310136 2690552 272934467.57 155356026472 127826010.29 1067048 1599744 228kbswpfree kbswpused %swpused kbswpcad %swpcad8388604 00.00 00.00kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty112992 2687204 392648897.20 274523626748 128623210.35 1035120 2824604 8kbswpfree kbswpused %swpused kbswpcad %swpcad8388604 00.00 00.00cachetopPIDUIDCMD HITSMISSES DIRTIES READ_HIT% WRITE_HIT%13767 rootsh417 0 0100.0% 0.0%13768 rootgrep 622 0 0100.0% 0.0%13764 rootgrep 641 0 0100.0% 0.0%13758 rootdd131840 131840050.0%50.0%watch -d grep -A 15 'Normal' /proc/zoneinfoNode 0, zone Normalpages free5155min4163low5203high6243spanned 262144present 262144managed 245382protection: (0, 0, 0, 0, 0)nr_free_pages 5155nr_zone_inactive_anon 59936nr_zone_active_anon 1nr_zone_inactive_file 87662nr_zone_active_file 77480nr_zone_unevictable 0nr_zone_write_pending 0

通过sar命令观察,发现swap区一直没有被使用,swpused始终是0

内存的memused一直增长到97%,之后一直在97%左右徘徊

通过cachetop命令可以看到,dd执行后,读命中,写命中只有50%

再通过/proc/zoneinfo看内存区域页面使用情况

nr_free_pages 这个值在一个区间内不断变化,当小于min的时候就会回收内存页,回收后的值会大于high,之后又立刻分配了很多内存页,一直降低,等低到小于min后再次触发回收

nr_zone_active_anon,nr_zone_inactive_file 这两个值也在不断变化

在dd运行过程中,系统回收了匿名页和文件缓存,只有再分配再回收

通过上面情况可以发现,内存在不断回收不断分配,但因为设置了

swappiness 为0,所以一直没有使用swap区

使用swap最多的10个进程

for file in /proc/*/status; do awk '/VmSwap|Name|^Pid/ {printf $2 " "$3} END{print ""}' $file; done | sort -k 3 -n -r | head writeback 27 watchdogd 38 watchdog/1 14 watchdog/0 11 ttm_swap 170 systemd-udevd 273 0 kBsystemd-resolve 371 0 kBsystemd-network 297 0 kBsystemd-logind 505 0 kBsystemd-journal 229 0 kB

当swappiness设置为60的时候

echo 60 > /proc/sys/vm/swappinesscat /proc/sys/vm/swappiness 60

执行dd命令,再观察结果

dd if=/dev/vda1 of=/dev/null bs=1G count=200sar -S -r 1kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty89480 92542891.181993217212 132270042.50 422460 442352 0kbswpfree kbswpused %swpused kbswpcad %swpcad2041596555522.651080419.45kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty72940 94196892.812103218852 132270042.50 431896 449072 8kbswpfree kbswpused %swpused kbswpcad %swpcad1943344 1538047.3377685.05

这次就看到了swpused在增长了

自己做实验的时候

Ubuntu的机器不管swiness设置的是0还是100,都不用swap

到CentOS的机器上,运行dd,才使用了swap

关闭再开启swap,也是一种常用的swap空间清理方式

swapoff -a && swapon -a

通常,降低Swap的使用,可以提高系统的整体性能,方式如下

1.禁止swap,当服务器内存足够大时,可以禁止swap,现在大部分云平台中的虚拟机都默认禁止swap

2.如果实在需要用到swap,可以尝试降低swappiness的值,减少内存回收时swap的使用倾向

3.响应延迟敏感的应用,如果他们可能在开启swap的服务器中运行,还可以使用库函数mlock()或者

mlockall()锁定内存,阻止他们的内存换出

参考

/proc/sys/vm Document

man proc

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。