易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 87|回复: 6
收起左侧

swap分区使用过高解决处理过程

[复制链接]
发表于 2025-2-27 10:23:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
遇到swap分区使用过高的处理过程+ L3 E" U3 c" m; Z
[root@devops-prod-jenkins-01 ~]# free -m
# _; `2 \4 ]; b! C  w( g              total        used        free      shared  buff/cache   available
  T! H9 F* p! Y. ]0 @7 x  f+ Q0 jMem:          15880        6479        3147          36        6254        90340 K( D, Z! o7 m
Swap:          2047        2034          13. S( }: [/ O* \  o, X

0 ?% `) `5 T6 @/ p/ _8 E$ j# f
; }5 L$ {& h: T! z* v
4 I- K( X, x, \8 {观察 /proc/zoneinfo 中这几个指标的变化
0 ~9 O9 `0 u( P& ~6 y- Qwatch -d grep -A 15 'Normal' /proc/zoneinfo
* N" k3 {: U& [  a1 B$ V9 H8 m. O& g, B% f! g
Every 2.0s: grep -A 15 Normal /proc/zoneinfo                                                                                                                                                   Thu Feb 27 10:09:19 2025
( n' |. q* I( j: a9 P+ p+ I* k  c4 [
Node 0, zone   Normal% T% O1 B* x! d+ ]
  pages free     120551
+ M1 O7 b. b, ^' w5 t' l        min      138670 }& ~+ X# K' t* Z
        low      173330 y7 X; w" I  Q7 ^/ [0 ^
        high     20800
# B& J; r; d+ n1 {6 ]3 X        scanned  05 q" a; v# J; g8 v" {8 v
        spanned  3407872, l" a" ^6 S+ M% }  F
        present  3407872
4 V5 T4 E) a8 l/ i( |9 p        managed  3336797
5 C* z0 w$ v9 G/ |    nr_free_pages 120551
: o$ D: J) ]- B' F3 T3 {& R5 B    nr_alloc_batch 828
4 _1 W8 G8 B* v5 I9 X; u4 T    nr_inactive_anon 315091' K9 f% U& T7 s1 j3 P8 ~
    nr_active_anon 1485863
' S4 D/ `( S- g0 D9 T4 F4 H) V% |( M    nr_inactive_file 442039
% o$ N2 o1 r& i6 x    nr_active_file 507331
7 c* Q& O! W' j0 h& s    nr_unevictable 0
0 y/ Q" ?! R% l. B- ^6 ]7 _$ g; D  U" }
剩余内存(pages_free)在一个小范围内不停地波动。当它小于页低阈值(pages_low) 时,又会突然增大到一个大于页高阈值(pages_high)的值。
- C) _; j$ d, `; _0 G: r  U
/ I7 b3 h! O6 ^2 y* k再结合刚刚用 sar 看到的剩余内存和缓冲区的变化情况,我们可以推导出,剩余内存和缓冲区的波动变化,正是由于内存回收和缓存再次分配的循环往复。% G9 T6 T' M; i2 R% |2 N7 P. R
* N3 e! p* y0 f
当剩余内存小于页低阈值时,系统会回收一些缓存和匿名内存,使剩余内存增大。其中,缓存的回收导致sar中的缓冲区减小,而匿名内存的回收导致了Swap的使用增大。* S! p4 k1 F. c; F% x8 P2 d2 ^: v
+ a: T" i/ f- m  b) b# o
紧接着,由于dd还在继续,剩余内存又会重新分配给缓存,导致剩余内存减少,缓冲区增大。+ x4 s! K1 H/ o
. D2 M0 A  U/ Z& I$ }* S. m) J$ A1 e
其实还有一个有趣的现象,如果多次运行dd和sar,你可能会发现,在多次的循环重复中,有时候是Swap用得比较多,有时候Swap很少,反而缓冲区的波动更大。
2 P# x$ A' ]7 H. W/ Q' r; f$ G& K6 e
换句话说,系统回收内存时,有时候会回收更多的文件页,有时候又回收了更多的匿名页。8 h3 q, C* V% H/ m8 I+ Y( t

, y0 ?$ h% M2 Z0 m8 j! H3 ]. l显然,系统回收不同类型内存的倾向,似乎不那么明显。你应该想到了上节课提到的swappiness,正是调整不同类型内存回收的配置选项。
4 H. m2 ?3 b$ p7 _, T: r1 I$ D7 H+ d9 c: i6 Z8 A
查看swappiness的配置
+ `+ V* G' ?4 @& Q2 H: K# cat /proc/sys/vm/swappiness 4 B" J2 q" O$ q' f! P0 I

. g+ a8 P* m: o6 i7 x4 S' D/ W60
: G% Q* |# I* o6 p/ uswappiness显示的是默认值60,这是一个相对中和的配置,所以系统会根据实际运行情况,选择合适的回收类型,比如回收不活跃的匿名页,或者不活跃的文件页。
* _- D; e  |3 r4 a; {) H" }" `
% U9 L' d+ v' K! C
( I. L- e% o$ L$ j
到这里,我们已经找出了Swap发生的根源。另一个问题就是,刚才的Swap到底影响了哪些应用程序呢?换句话说,Swap换出的是哪些进程的内存?
& O/ z8 Z3 e, y: F; t- ]# C$ p$ p& `( \2 V. u- f

9 F  d; @# w% t' Y1 J/ K! g$ j4 S& g这里我还是推荐 proc文件系统,用来查看进程Swap换出的虚拟内存大小,它保存在 /proc/pid/status中的VmSwap中(推荐你执行man proc来查询其他字段的含义)。8 Q  G1 z9 M# J: c3 P( B
* T9 C0 u6 }* O! d

9 m- a7 P3 J; |6 Y在第二个终端中运行下面的命令,就可以查看使用Swap最多的进程。注意for、awk、sort都是最常用的Linux命令,如果你还不熟悉,可以用man来查询它们的手册,或上网搜索教程来学习。
" q2 H1 r( X* u. e0 P1 ]! \6 B& J! \+ [
for file in /proc/*/status ; do awk '/VmSwap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 3 -n -r | head2 Z7 R0 a- v9 L9 k) V
dockerd 2226 10728 kB
' x) L" |# }( S1 C! t% E, f9 Ddocker-containe 2251 8516 kB# |  D) k* L, t- a$ |
snapd 936 4020 kB
- u* P8 M* V! Y1 N% j6 }6 S* i5 Fnetworkd-dispat 911 836 kB, }$ K" i1 K4 y; J8 c
polkitd 1004 44 kB
4 Y* a3 Z4 N, O4 @/ N/ ^% O- q
7 l0 g# f0 ?" e* Z% G5 J  k' q, B5 u9 j6 c) w

" W8 t8 a6 p$ r9 ^7 X- R

. ?3 ^7 v! P% g% B+ W也就是说,你的内存在使用到100-60=40%的时候,就开始出现有交换分区的使用。大家知道,内存的速度会比磁盘快很多,这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。$ K& L( O  I& \+ f& V

" ?7 A0 G9 y. d: ~临时调整的方法如下,我们调成10:
2 f" m) @) f8 h4 Y: f2 R/ z, U5 B
9 y. n1 X$ g, d% Psysctl vm.swappiness=10- O. n; q( ?; w, R
cat /proc/sys/vm/swappiness
8 E) R: G4 J# `% b10
8 C( M5 E5 v0 L2 f) P# p7 W1 o2 ~* L7 z+ ^1 d+ \2 i) x
这只是临时调整的方法,重启后会回到默认设置的
0 h% N2 {2 x9 y7 O) @; D: i7 x# ?4 ^& e) T* R
要想永久调整的话,需要将在/etc/sysctl.conf修改,加上:' |6 W$ n- m( R, V

; ]9 N1 Z2 N4 m5 A. W) \cat /etc/sysctl.conf
4 u1 M6 i, N) H' p* i, dvm.swappiness=10* f2 i0 T. q7 G1 W) |! Y& Z
+ H9 a; m& [4 A. R, c
$ y) W% G& w/ W+ \  k
解决方法:, a$ F' A7 w; v! b9 O
1、调整swappinness参数
7 h- m9 o# G' D5 t, q' f( H  b8 T: k6 c6 N1 m9 |: I- S
临时调整0 o0 D, S+ b. D1 X
# sysctl vm.swappiness=308 q9 S) C! d1 m% c4 G" K7 T
vm.swappiness = 30
8 b  f3 C' G( K2 M; o2 c4 j
1 U: f* s* w" }. Z# cat /proc/sys/vm/swappiness
* J- g- b# L! x6 q+ |; H) s30
. ^0 g$ o$ `7 V1 m2 @  D- I# _3 l/ s4 S0 c; a
永久调整:
& J5 R$ ?" r* y  ^0 s% G: p8 W设置
( z* a4 R  n8 b. e6 N& X- z修改文件/etc/sysctl.conf文件
) {% H1 ~2 E& Tvm.swappiness = 304 \# X) m4 T' O6 J3 J! C
生效3 k: D) p; |8 D( N# C2 }- G( f; y
sysctl -p; H- _4 l: t, f+ T9 w! X5 o

1 E; n3 i" \' r1 [( ]3 f# b2、调整swap空间8 [* I2 p" u/ n9 @& B

4 Y7 J4 P1 g" t
使用dd 创建swap分区5 z1 W) f' l& g0 S
dd命令创建sawp文件:% @$ M' ~. G% l9 W% L- ~
# dd if=/dev/zero of=/swap bs=1024 count=1024000. U8 p# H# s' e8 g. y5 k. M$ a
1024000+0 records in
& `. z& r) w' A1024000+0 records out. S) t" l9 g8 v3 o" a
1048576000 bytes (1.0 GB) copied, 2.14338 s, 489 MB/s
% p: q  J+ u) U+ `' p## g# g+ k- f5 s4 b8 v  G
& Q' l) ?6 h8 V$ W2 P1 G* ?
制作为swap格式文件:
! D8 n- W+ Q' x6 \$ L1 A1 _8 _7 t6 c2 K/ b7 x/ u  f
# mkswap /swap* L6 T5 R: s: r2 Y; V
Setting up swapspace version 1, size = 1023996 KiB; J: d# C7 u4 i" c
no label, UUID=2fb7fd7c-d5aa-451b-9766-5acb72dd6990! V& L. P$ L& S* k5 a' ^

0 Y* A* {! U* L3 o; u6 E- a
1 d, A3 L) S5 B7 g) r" a: y% y3、再用swapon命令把这个文件分区挂载swap分区
" C- ~8 C, C/ r: Z# swapon /swap+ U/ s9 w9 Y, Q+ k  t
swapon: /swap: insecure permissions 0644, 0600 suggested.
0 l# F2 W( |( h+ F! e" ^1 [
8 s4 |, G/ V' z, a  Q. [# U
1 t# |1 @  n3 p4 {
9 y0 ?# }. v& f; U4、为防止重启后swap分区变成0,要修改/etc/fstab文件7 S, @. \( ^: R' z: x
vim /etc/fstab
5 e/ ~( e% K) x9 k, S8 n" L) @/ X1 ?在文件末尾(最后一行)加上:
+ @# ~3 s) x" E/ e/swap swap swap default 0 0
3 a6 T9 T$ ^) S# j+ K$ o3 i6 B7 ?. U/ s6 {' G
mount -a
) u5 B4 }  @" C! H  l8 K$ o) G& G( X" y7 h" _$ Q9 y9 ~1 B* U4 |$ n
扩容swap 分区:, p2 e, {2 ], p8 w- j9 [8 t
[root@kvmvm ~]# swapoff /swap
9 k/ a) J: s  Z3 u( i& R5 H, N7 j: l
# dd if=/dev/zero of=/swap bs=1024 count=1048000
& D7 V4 J1 N: T0 U; M$ y5 d( r0 H1048000+0 records in
! I4 l" f! m7 v% E! U  f& X1048000+0 records out
1 U7 [5 T  L% I, A1073152000 bytes (1.1 GB) copied, 12.6694 s, 84.7 MB/s
- u0 x, V# H8 Y: T5 f. I' ]( _: D- E% Q% N- t
# dd if=/dev/zero of=/swap bs=1024 count=20550002 W( U% `3 n8 P: W

6 N/ `# E  N! ^8 {. z#  mkswap /swap
; d9 ]2 S3 n1 ?- j# wSetting up swapspace version 1, size = 2054996 KiB
$ X0 c; V" C& W; I3 ?no label, UUID=8dd77b7a-744a-452d-b991-5b2e01702464
( a* A; |8 m* }7 y0 b3 |# I) j- J8 p6 T' U7 x+ x# X  z

& T( j! Y6 d0 M, H; |, D' N# swapon  /swap
1 ?4 |8 s, V9 H3 F1 p4 Zswapon: /swap: insecure permissions 0644, 0600 suggested.
2 Z4 f$ G7 h( `swapon: /swap: read swap header failed: Invalid argument
/ W( f6 F3 x. L2 |* K  L: o! h5 p& M% `& {$ [3 R
# mount -a5 O6 A. k8 L% n6 c0 ^0 g
6 _* D0 r9 ~0 `( U/ s1 g. f6 |. K
              total        used        free      shared  buff/cache   available
9 U9 g; x! t: |+ K+ @Mem:             31           1          27           0           2          29
! A6 T6 i# O: M, Z+ l$ U$ dSwap:             1           0           1
! B5 P. c# B; X3 k% f free -m
8 \! c! f* z: W              total        used        free      shared  buff/cache   available
  {- d" Z1 o% `+ sMem:          32011        1037       28171           8        2802       30595
& [) @# D( ?7 ]$ R; l+ P, z3 |2 L* ESwap:          2006           0        2006% y5 [  \) T. H& F. k7 K

* p) R# l% L  L' G2 U可参考这个值:
6 w! O% t# k/ i! f0 q
% X- g) c& d4 Z- R. ]https://www.bbs168x.cn/forum.php ... &highlight=swap' b! m# o* g3 U7 ?2 t7 s6 _( {

- v" c- {1 l3 z! G" D; F
6 G: n/ T6 o0 A8 b9 e- w  ?
( T+ n# C( ^+ S( T. q- f! y2 G" B2 v: s- L5 N0 s) {4 }1 b
 楼主| 发表于 2025-2-27 10:31:37 | 显示全部楼层
https://www.bbs168x.cn/forum.php ... &highlight=swap也可以使用这个方式进行扩容swap分区。
发表于 2025-2-27 10:52:41 | 显示全部楼层
[root@jenkins-01 ~]# sysctl vm.swappiness=10
4 J5 `6 B3 t& T. b5 I$ b5 P- Fvm.swappiness = 10
% D3 G. t3 n! ~+ q4 E+ Q* u% _$ S- }( e7 V; m" a/ G' F
[root@jenkins-01 ~]# free -m
" r0 ~7 r: T& \* T! F; ]              total        used        free      shared  buff/cache   available4 J: x: A1 x& n  w3 w
Mem:          15880        5080        7093          27        3706       10441! K* C7 d. ]) I! F! T$ D+ r: P
Swap:          2047        1952          95$ y; n3 E% x9 D
# `4 y. a- i2 T9 K# y
设置了感觉没有什么效果。
发表于 2025-2-27 10:54:33 | 显示全部楼层
(3)操作释放步骤
* `5 f; m5 X5 T" n  n(a)swapon -s查询挂载的分区,记住这个名字name,比如名称叫/dev/dm-1
# M' x: L  h# S: B6 m6 b& }$ V1 R% a' k; t' z8 l/ K1 \
2 a9 n2 X  V, F& b
(b)关停这个swap:swapoff /dev/dm-1
  ^  ]" Y$ G9 h' r(c)需要等待关停结束,需要等待比较长一段时间,可以通过free -m查看什么时候swap值为0即为关停完毕! C0 S1 e+ \+ W6 c
(d)也可以用swapon -s看下是否关停完成
) V* f) y0 Y# H- b6 n(e)重新挂载:swapon /dev/dm-1
& S8 W0 Y& |! T7 M. V0 \. b(f)通过free -m可以看见挂载完成,swap占用内存释放完毕1 W9 J! t$ O# O& C0 b2 a% h
发表于 2025-2-27 10:55:37 | 显示全部楼层
# swapon --help
/ \5 y  V. z" E/ b# M/ {; m$ [# y) w, D3 K
Usage:" F0 h0 c: A' {/ O8 q
swapon [options] [<spec>]" n+ A3 D/ e' L+ V& C3 o
3 N, T3 X+ L+ o  f. k
Options:& l1 O- z. S5 U9 v
-a, --all                enable all swaps from /etc/fstab
- q, [8 e( @( g2 ~ -d, --discard[=<policy>] enable swap discards, if supported by device
0 _+ u$ D& J" F! s3 y  S& l- v8 ? -e, --ifexists           silently skip devices that do not exist
2 U5 i2 R  |6 R4 y7 t7 }% ^6 `7 l -f, --fixpgsz            reinitialize the swap space if necessary
1 z- P2 {1 Y+ h  I/ Z -p, --priority <prio>    specify the priority of the swap device+ `9 Y" T8 r" h7 G
-s, --summary            display summary about used swap devices% Z9 R; p8 Q: ^) x0 \* H
     --show[=<columns>]   display summary in definable table
* {' Z  H/ ]7 Y; E5 b     --noheadings         don't print headings, use with --show7 x0 ], g, l! }- r# v' _+ D7 [/ F
     --raw                use the raw output format, use with --show
( a( |% I2 z% ]$ B- a8 {     --bytes              display swap size in bytes in --show output
8 \% T! q1 m* T& b9 E -v, --verbose            verbose mode6 a% L4 }9 L. i4 W4 O

: ~2 t% y4 b6 f -h, --help     display this help and exit5 S9 [- }/ G! _
-V, --version  output version information and exit, b+ u5 a1 G8 D

+ h! l$ O; l. J" CThe <spec> parameter:
, K. y1 V/ L9 @  a -L <label>             synonym for LABEL=<label>
9 C" g; K6 d" ]/ P% y -U <uuid>              synonym for UUID=<uuid>2 h8 Z9 r7 L( _. C0 W
LABEL=<label>          specifies device by swap area label
% i/ F3 O4 O# ?' Y6 P UUID=<uuid>            specifies device by swap area UUID
8 q/ C/ s; G. p% P PARTLABEL=<label>      specifies device by partition label# U# v* R3 P' m5 Z
PARTUUID=<uuid>        specifies device by partition UUID9 ~5 U; n! P* X/ q6 q
<device>               name of device to be used3 ]: x' {  J+ u; B/ x
<file>                 name of file to be used8 N# r( W8 }& E' {

2 C. P1 d" f: d) Q4 D% h$ EAvailable discard policy types (for --discard):# z  l6 r  t: Y2 f! H8 r% t
once     : only single-time area discards are issued. (swapon)1 f1 m' P; M/ X
pages    : discard freed pages before they are reused.  u0 i. {+ \: G& U* D3 L
* if no policy is selected both discard types are enabled. (default)
8 c; V# Z7 R5 w% U* {) b7 V# j9 w/ D7 F5 M3 W6 c
Available columns (for --show):7 P" |# }$ C3 \& L$ S& ]
NAME  device file or partition path  U8 A) n: M+ M8 S# m
TYPE  type of the device
$ K! v1 G8 C$ w6 b SIZE  size of the swap area
/ k: c0 b/ n+ ]) X USED  bytes in use
( q3 p* v# L7 ?# p+ v2 |- T PRIO  swap priority
7 c" u3 s' R/ u8 S, T2 R0 n& |9 L9 s+ ?8 ?. P5 b$ ~( p
For more details see swapon(8).
 楼主| 发表于 2025-2-27 10:56:32 | 显示全部楼层
生产环境有的操作还不敢执行。只能先记录操作。
发表于 2025-3-1 22:00:45 | 显示全部楼层
sysctl vm.swappiness=10! M1 J' a6 n2 d& i
cat /proc/sys/vm/swappiness: V+ b5 K8 w+ t
这个设置了,不生效。
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 20:23 , Processed in 0.054370 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

快速回复 返回顶部 返回列表