找回密码
 注册
查看: 97|回复: 6

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2025-2-27 10:23:41 | 显示全部楼层 |阅读模式
遇到swap分区使用过高的处理过程
6 Y& F1 s- c! O) @' P' D[root@devops-prod-jenkins-01 ~]# free -m
' l: Y/ h# s- e+ O# ~+ V              total        used        free      shared  buff/cache   available. ~0 b+ c# ?! O4 a. \! U, O
Mem:          15880        6479        3147          36        6254        9034
5 p1 d2 m8 H& N8 n  l. T) n: X0 mSwap:          2047        2034          133 d* g8 u# c6 n4 ]

9 L2 E! w- v: E3 C4 h! L
0 v0 T9 P! e( @5 N9 }, O. b: X# p3 G+ [$ d2 n4 U" g( C
观察 /proc/zoneinfo 中这几个指标的变化
8 h: F/ [! o- @6 V) Z( Z' v; ]4 owatch -d grep -A 15 'Normal' /proc/zoneinfo # |# N- j8 ~$ B' |! d
# r: b: g" I" Z
Every 2.0s: grep -A 15 Normal /proc/zoneinfo                                                                                                                                                   Thu Feb 27 10:09:19 2025
( h3 D8 |0 m+ R; D! ^4 B% ?1 @' t% e; a. e7 L
Node 0, zone   Normal
. @+ R  \0 m/ e- P  pages free     120551
" T  T' B. _( ]7 ]        min      13867# W, K2 K! d$ B
        low      173336 A. o8 u2 D) j$ V9 g9 r6 a
        high     20800
& ?& g$ w" m2 W5 d2 w+ _" @        scanned  0
* S2 a6 l5 q& s3 w9 K* L        spanned  3407872; B$ Y, g# Q- V
        present  3407872) K( Z# D; |  r0 n9 \+ g
        managed  33367977 y+ D. k1 g9 H4 g3 f9 K
    nr_free_pages 120551; r; e8 _6 }, |! \9 b9 n
    nr_alloc_batch 828
9 C, d  n! ~( e1 N7 t    nr_inactive_anon 315091
% u5 m7 n; x+ \    nr_active_anon 1485863
1 ~) w$ q3 d% n9 H2 l    nr_inactive_file 442039  V5 B% }% n6 y1 U" H" q
    nr_active_file 5073314 t2 |& X& B0 g# {; E3 h0 _
    nr_unevictable 06 n; {$ i$ v2 u5 @4 s+ u* _
, v5 z% q4 u( D: C- x3 h  m
剩余内存(pages_free)在一个小范围内不停地波动。当它小于页低阈值(pages_low) 时,又会突然增大到一个大于页高阈值(pages_high)的值。
: s" w' `) d) u
3 M, t1 h- D6 q  W  l  M: w再结合刚刚用 sar 看到的剩余内存和缓冲区的变化情况,我们可以推导出,剩余内存和缓冲区的波动变化,正是由于内存回收和缓存再次分配的循环往复。- j$ z3 V6 _- R" F6 _  w

' I) V+ b( B2 c- ^4 x: \6 x- c当剩余内存小于页低阈值时,系统会回收一些缓存和匿名内存,使剩余内存增大。其中,缓存的回收导致sar中的缓冲区减小,而匿名内存的回收导致了Swap的使用增大。; ^' p# o! E0 f: k  q, Y) Z

4 R9 y; @$ m( n1 n0 z8 h0 ^2 T7 {3 L紧接着,由于dd还在继续,剩余内存又会重新分配给缓存,导致剩余内存减少,缓冲区增大。
' Z% M: y& o" B8 `
) Z$ H  J7 k( C3 N3 f其实还有一个有趣的现象,如果多次运行dd和sar,你可能会发现,在多次的循环重复中,有时候是Swap用得比较多,有时候Swap很少,反而缓冲区的波动更大。2 o2 v! v: \3 R. f2 {6 t' A$ A

- O, F5 a" z/ n" t* u换句话说,系统回收内存时,有时候会回收更多的文件页,有时候又回收了更多的匿名页。
$ E+ D+ u9 b" T3 p8 c/ d2 ?1 J* u! T- \2 G5 ]6 Z' @
显然,系统回收不同类型内存的倾向,似乎不那么明显。你应该想到了上节课提到的swappiness,正是调整不同类型内存回收的配置选项。1 A' F) j5 B( Z8 J) z# }

. _( g5 L1 n' B# Z+ X! N查看swappiness的配置. z  p! K. y2 j) g0 L8 o  z; G
# cat /proc/sys/vm/swappiness . M- |2 I( n. w( b! A* W

; G+ ]) p4 z) h. r; Z60% E: [# U0 ]) Y& S
swappiness显示的是默认值60,这是一个相对中和的配置,所以系统会根据实际运行情况,选择合适的回收类型,比如回收不活跃的匿名页,或者不活跃的文件页。( `/ U# G: W* h3 _, Y. f* j! C- S

* l+ c6 G% l$ Y
; Y0 h& J, M6 p1 o
到这里,我们已经找出了Swap发生的根源。另一个问题就是,刚才的Swap到底影响了哪些应用程序呢?换句话说,Swap换出的是哪些进程的内存?- I& S3 n. X2 j2 Y: B& K+ v
8 n) }- `' w4 L$ J1 u

( V8 o6 S( h/ P. ~+ p/ q) r" S- @3 u这里我还是推荐 proc文件系统,用来查看进程Swap换出的虚拟内存大小,它保存在 /proc/pid/status中的VmSwap中(推荐你执行man proc来查询其他字段的含义)。
2 d# g8 R+ [% N+ D% U" d
/ ]4 R$ L. j- [: Z) B  [9 s6 ?) T: m

8 i$ k, ~8 ^- O在第二个终端中运行下面的命令,就可以查看使用Swap最多的进程。注意for、awk、sort都是最常用的Linux命令,如果你还不熟悉,可以用man来查询它们的手册,或上网搜索教程来学习。
# g* _, W  h" f. m4 M6 }. Y- d  ]2 N" v% b/ `! a7 Q) p
for file in /proc/*/status ; do awk '/VmSwap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 3 -n -r | head' Z8 Z) Q, D: Y- }! {  E5 @8 x
dockerd 2226 10728 kB7 m5 s. A' c$ a9 ?2 h% f( H+ h3 c
docker-containe 2251 8516 kB- L6 W, b  A! U2 Q7 K; ]. F
snapd 936 4020 kB
5 A' x: d+ V/ P  D/ |networkd-dispat 911 836 kB- h2 ]; }' A# f+ Q8 ^3 F5 w
polkitd 1004 44 kB
; p+ ?# m4 u6 u' B* B; a6 \- V. l; ?: w9 p. ^1 L1 ~
' \) z$ ?/ s; X: ~1 N

; o# R4 L, N/ b5 w1 i$ _9 v) d
  M1 l( K3 c2 r8 x5 H; C+ [* |
也就是说,你的内存在使用到100-60=40%的时候,就开始出现有交换分区的使用。大家知道,内存的速度会比磁盘快很多,这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。4 W3 G, e% `. D# r1 v9 c0 v
3 f& v  o! C0 t3 C% l! j8 X
临时调整的方法如下,我们调成10:
* S  O+ x% O( G/ w5 l7 o" i* G9 U1 `4 L
' t4 }! r8 i5 W( usysctl vm.swappiness=10% U3 s+ A& L+ I
cat /proc/sys/vm/swappiness9 M5 n7 U6 f  V
108 A  j8 p% C! W( m. ^  c( d

5 S4 A! t. ]0 w8 e+ x这只是临时调整的方法,重启后会回到默认设置的
. U. r( X9 v( @  H( e, g
+ ?) _3 G$ {, ]! e& U" t, O7 M9 d要想永久调整的话,需要将在/etc/sysctl.conf修改,加上:
0 k5 n2 R9 F# `8 I/ T7 d2 {& U2 ], D; r- V1 R9 i
cat /etc/sysctl.conf
' w5 k; D6 L' [" E- D" R3 Vvm.swappiness=10
. G6 }+ s- A: `) h7 ?% }' C  t1 W: I! B8 l0 [0 R

! F4 F- R& a( V解决方法:0 t* w% _; p  I9 g  [2 [; O2 s) z
1、调整swappinness参数
- H! S7 P4 A/ i
. w5 _  o# R$ ]+ w临时调整/ n3 l' \0 s4 u. \9 U
# sysctl vm.swappiness=30- N& C0 p# J! u2 L; w
vm.swappiness = 301 S6 b9 k5 S) ?" |5 G0 l
$ ]# \4 L/ `1 C* p2 s, D7 B% s- R* I
# cat /proc/sys/vm/swappiness / l" J7 M* A) q- K, U* Q
30
5 j( `5 L1 ^/ d2 W' G& c4 o% A$ v
& ~0 F: n' x- d  N8 `永久调整:
, G) P2 X; F" a* \& c6 \* ~1 B设置2 E* {  }  D2 _2 s. x
修改文件/etc/sysctl.conf文件& O0 D+ Y: U5 v* j6 t- u/ T
vm.swappiness = 30  s& \" @7 K: y% q- g
生效8 |) \, K" F3 z
sysctl -p
3 @& g* p' ]$ D5 j! m* i6 r- C+ `! a& {3 z+ A4 D: D) d! S
2、调整swap空间$ Q, D4 n7 i( P8 {, H; K

% ?! c+ p: D2 N9 U  ~* {
使用dd 创建swap分区( c& c# ]& Y* D" X4 S
dd命令创建sawp文件:
/ N$ D1 c# N( Y  e% p3 M; V- c! s# dd if=/dev/zero of=/swap bs=1024 count=10240009 v7 a, b4 L' v4 H" ~- f
1024000+0 records in
' F, R/ q* _7 }, z+ k0 O0 u  c0 ]1024000+0 records out" v0 `1 B" ?5 k3 w
1048576000 bytes (1.0 GB) copied, 2.14338 s, 489 MB/s
+ U! f; Z" |( O- s/ H: Q6 y8 J! L: q#
; b; ^" Q% a, f" r6 m5 x
3 K+ u1 @8 O! z% C, p制作为swap格式文件:
9 L2 b, U' H5 U$ ~0 I1 R  ]' K: j9 j' a4 t
# mkswap /swap
; U- G1 x! e/ z3 nSetting up swapspace version 1, size = 1023996 KiB
- K4 ]3 ], P/ L5 O( g! dno label, UUID=2fb7fd7c-d5aa-451b-9766-5acb72dd6990
  |& D! d5 @: c
5 w" T5 [$ k, C3 }- e: M2 C  S) ?7 O. I( n
3、再用swapon命令把这个文件分区挂载swap分区+ y4 l  J9 u1 }3 a
# swapon /swap& d8 j' T5 E8 S2 B. T7 C  v) a
swapon: /swap: insecure permissions 0644, 0600 suggested.
' D+ C5 T3 u/ s# I2 Q8 G) _4 y# S! i1 [6 ]: N. u
. ^4 B/ i4 n: ?- g' X
) p" \$ A9 W- o* D0 d3 D& d
4、为防止重启后swap分区变成0,要修改/etc/fstab文件6 q* ?6 ?& X. {4 c
vim /etc/fstab
: m0 X; r  B' P/ j( j1 i在文件末尾(最后一行)加上:+ N& F9 U) n- N: `3 m6 M
/swap swap swap default 0 0
5 d8 N% j. T6 R  I' n
% W& g& N6 \) B4 i. g/ Vmount -a3 ?. {5 n; S7 i  P: r* P! _

, f: L1 `5 p: x2 P扩容swap 分区:- x: y/ [: H2 y  P: J
[root@kvmvm ~]# swapoff /swap' `! B) n6 n4 W. H" ~( `

% Z/ {  s# |$ p0 f# dd if=/dev/zero of=/swap bs=1024 count=1048000. V% _# P& g" N  G6 q9 K; l
1048000+0 records in0 [% ?( D$ n5 u/ d7 n( {0 x: \; n
1048000+0 records out5 C/ A% {( k3 j8 S* ?
1073152000 bytes (1.1 GB) copied, 12.6694 s, 84.7 MB/s
/ I) Q- V$ U; f4 z4 S3 ^8 |2 D  l; e% H' O
# dd if=/dev/zero of=/swap bs=1024 count=2055000( s, L3 r  Y+ b% l$ c5 W: a& t( G

' C+ y5 N3 `& J; @$ B" s% U#  mkswap /swap
5 ]' \3 R5 R0 U6 SSetting up swapspace version 1, size = 2054996 KiB
7 h" J8 o7 [* z1 o4 R. e" h& D. Lno label, UUID=8dd77b7a-744a-452d-b991-5b2e01702464
$ y4 p: _* Y; M. c( c% |, M" n2 }5 y; F) Y% o% q# L

  P5 u1 ~5 U( ?2 G& J# swapon  /swap) X1 y# v1 }6 o) h9 q' i1 U
swapon: /swap: insecure permissions 0644, 0600 suggested.) H1 V" u  {! M  P
swapon: /swap: read swap header failed: Invalid argument
3 v  e0 D  ?3 E8 Q' C- d: ]
+ M; `7 z# l$ U( }* K# z# mount -a
+ M' A/ B; L0 y7 w0 n1 _
) G: K- p9 w7 a! p. W" q              total        used        free      shared  buff/cache   available
/ P0 z3 f: B. m+ k2 u: Q9 x1 A6 SMem:             31           1          27           0           2          29
- M$ V4 x6 j: d3 N4 `, N" {8 W; v' jSwap:             1           0           1( k* z4 Z- M: {+ @* f) ?9 }
free -m
9 k0 |6 p' S4 t              total        used        free      shared  buff/cache   available
' F# D: X# v5 X; F) O/ }% r7 j& vMem:          32011        1037       28171           8        2802       30595
8 A9 ~) i4 F' I% g( i2 G: WSwap:          2006           0        2006
6 D" t3 h2 I) Y; i* E

  R3 O& L. p8 r1 n可参考这个值:
& }1 B9 k" b( f2 H5 s( f1 w" @7 q* V% [' o+ t( ~8 w/ q1 E
https://www.bbs168x.cn/forum.php ... &highlight=swap
* W& x! w7 m& j2 b+ N) Y3 Q. N7 G2 ?( g" g( Q* y. N
1 s/ a6 ~* T( m* A3 s  `4 k
# `( v3 h+ g' s
# G# {5 n6 [/ J" B: O+ A

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2025-2-27 10:31:37 | 显示全部楼层
https://www.bbs168x.cn/forum.php ... &highlight=swap也可以使用这个方式进行扩容swap分区。

70

主题

73

回帖

1201

积分

网站编辑

积分
1201
发表于 2025-2-27 10:52:41 | 显示全部楼层
[root@jenkins-01 ~]# sysctl vm.swappiness=107 T/ ?+ ]* |. c- {
vm.swappiness = 10) U, _# z' F0 o) t0 o( N0 [

5 s4 O! v; t2 A, {[root@jenkins-01 ~]# free -m + E/ W" [7 ~5 e' L" b% O; X6 ~8 c. _
              total        used        free      shared  buff/cache   available
1 {* k/ q) P& X7 N: }+ jMem:          15880        5080        7093          27        3706       10441  r* Z7 B1 M8 J
Swap:          2047        1952          95
4 K; {0 z% b- |
  @2 }/ [0 @! f设置了感觉没有什么效果。

70

主题

73

回帖

1201

积分

网站编辑

积分
1201
发表于 2025-2-27 10:54:33 | 显示全部楼层
(3)操作释放步骤
% P# s. w' H3 r& N  f0 z(a)swapon -s查询挂载的分区,记住这个名字name,比如名称叫/dev/dm-1
# D; G( o' |1 O1 q7 E  l; H* v  ]
) g! b2 i. p6 U% U- A
(b)关停这个swap:swapoff /dev/dm-1$ D, ~/ P4 ?3 u; M
(c)需要等待关停结束,需要等待比较长一段时间,可以通过free -m查看什么时候swap值为0即为关停完毕
  E7 I& q* d3 Z. l0 d(d)也可以用swapon -s看下是否关停完成
6 j6 _% @& H; q" J' |4 a9 X0 {2 p+ l(e)重新挂载:swapon /dev/dm-11 K+ Q; r0 y: b: P+ O  t: i! W
(f)通过free -m可以看见挂载完成,swap占用内存释放完毕
" _9 N. ~8 z  ^8 ^

70

主题

73

回帖

1201

积分

网站编辑

积分
1201
发表于 2025-2-27 10:55:37 | 显示全部楼层
# swapon --help - ?: k& }! y) w4 {9 _/ F
- |/ f! |$ N$ [: Z' G
Usage:8 l! R! {1 _3 T# g6 t; M# J8 D; |
swapon [options] [<spec>]
8 k9 B6 T) ?. `  }: _
# A$ g6 n' T: I$ f$ q# @Options:  D% m4 p( ^9 p# v
-a, --all                enable all swaps from /etc/fstab3 M  @1 P% l$ V* {6 p
-d, --discard[=<policy>] enable swap discards, if supported by device" K, Q% I. d$ Z8 T2 B9 W5 {
-e, --ifexists           silently skip devices that do not exist
2 ]7 H* Y0 Z. K, n& R8 X$ n2 k/ M -f, --fixpgsz            reinitialize the swap space if necessary% r  u0 @7 E2 L; [
-p, --priority <prio>    specify the priority of the swap device
1 K6 L) `: {& ?, C' ]4 W -s, --summary            display summary about used swap devices
, q' l6 V6 T. l! i$ F9 r) g     --show[=<columns>]   display summary in definable table3 X- H& M$ x# T2 Z& n
     --noheadings         don't print headings, use with --show) {, p$ r  w, K7 E( Q* k
     --raw                use the raw output format, use with --show
  s+ }3 W/ l+ W2 H! G$ Y6 W     --bytes              display swap size in bytes in --show output
* W  U% [1 n' k  Z9 E3 N -v, --verbose            verbose mode9 m/ C& ]! _' O( D( @, Y! ^& ]9 k+ n/ k

7 G* ~9 ]! B0 w -h, --help     display this help and exit
6 ]  ?/ x- K$ s -V, --version  output version information and exit" K. W. Z9 L0 m

. k- [- Y; R5 ~: y; F4 ]0 m5 nThe <spec> parameter:8 v% }9 W& O' k* e# k. n6 X
-L <label>             synonym for LABEL=<label>
( F1 k9 g- ]1 Z. Q0 v -U <uuid>              synonym for UUID=<uuid>% g' |4 F7 b) j" \( _
LABEL=<label>          specifies device by swap area label  w" J9 [# p) k; @) t. f# ]
UUID=<uuid>            specifies device by swap area UUID, T; y: k2 A$ j2 y4 B4 h3 _1 _
PARTLABEL=<label>      specifies device by partition label
6 D4 B) n6 N/ C: B4 Z  |8 G+ l3 Q PARTUUID=<uuid>        specifies device by partition UUID
! O4 e/ d! T6 E- E <device>               name of device to be used3 {' d  c% ^8 Z- ]' H) y; u
<file>                 name of file to be used
$ d! P5 y% n  S
( N9 A: e8 e1 fAvailable discard policy types (for --discard):
" O5 Z8 I) \. w9 y0 V& d once     : only single-time area discards are issued. (swapon)
% G3 `" }* a7 t5 l pages    : discard freed pages before they are reused.
3 p) \, |- g6 X4 P! h * if no policy is selected both discard types are enabled. (default)+ E" A: v3 m3 @+ f  n; A8 u
- b9 q0 l9 ~, [0 o$ Y
Available columns (for --show):9 n, n, {8 k( w3 @: u- k% w
NAME  device file or partition path# |* k, h( z" r: [
TYPE  type of the device
9 C- `( S4 W: N SIZE  size of the swap area+ D2 Z9 B  R- c2 K
USED  bytes in use# A' l% R5 n6 r% F" F. y2 j) p
PRIO  swap priority( v2 {2 _3 V7 P. b

2 j5 f% q% ]* B8 X( R$ P1 hFor more details see swapon(8).

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2025-2-27 10:56:32 | 显示全部楼层
生产环境有的操作还不敢执行。只能先记录操作。

70

主题

73

回帖

1201

积分

网站编辑

积分
1201
发表于 2025-3-1 22:00:45 | 显示全部楼层
sysctl vm.swappiness=10
5 Z! V* J4 W& Vcat /proc/sys/vm/swappiness
( ~8 G7 ]6 I1 s5 Q+ }7 \* E) s这个设置了,不生效。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 01:45 , Processed in 0.015033 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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