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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2025-2-27 10:23:41 | 显示全部楼层 |阅读模式
遇到swap分区使用过高的处理过程
6 I* F) e/ g' n# I! D[root@devops-prod-jenkins-01 ~]# free -m
: c( e. I# L" C              total        used        free      shared  buff/cache   available4 n# w! e: k5 i& @6 k+ H6 _
Mem:          15880        6479        3147          36        6254        9034
" k5 a. C: _+ ?$ i, u0 O% GSwap:          2047        2034          13
' c- T0 m6 l: N9 _9 m; U6 d7 g  _. i

% w! N: t- i1 g7 X. o; b/ l2 n, [
' M: q, E  `  P/ _: k( d* V观察 /proc/zoneinfo 中这几个指标的变化
# O) C! }3 R- c" {) y7 L8 Uwatch -d grep -A 15 'Normal' /proc/zoneinfo
! g2 Z" t) d9 q8 W% w
9 b, t/ Q" A5 v- O1 K# |9 jEvery 2.0s: grep -A 15 Normal /proc/zoneinfo                                                                                                                                                   Thu Feb 27 10:09:19 2025
' Y; z- K; v" e" e6 |/ a1 D- T' Q/ s4 _* g* X; Q  Z9 i  Z" c, D1 g
Node 0, zone   Normal' D( o9 A/ h' S" p! r
  pages free     120551& w! S+ [" G7 N2 e$ q
        min      13867
! P* v, P. v$ ^+ a* p        low      173334 c3 |, _( h8 d& g+ Q
        high     208006 T% F) @% `2 H
        scanned  0
. n% Q& |3 T- F- |3 d! |        spanned  3407872) l  z2 U- w, U1 B7 p# A
        present  34078721 u" M. g. I& E5 C* Q' a: y7 i
        managed  3336797  z, X! {+ t7 {
    nr_free_pages 120551* U3 N) ~- a& d, g9 x9 r7 X
    nr_alloc_batch 828, _$ d" k! e! k  ^$ I6 `
    nr_inactive_anon 3150911 r: d& X& |7 j, i' g+ ?, k
    nr_active_anon 14858639 N9 h+ ]. T% O8 O
    nr_inactive_file 442039. H. b, R1 f4 L# |
    nr_active_file 507331
2 y+ H5 H8 E' O: I. H- @    nr_unevictable 07 N" B5 y+ ]: Q& P

3 h) u: b+ K# i" i$ w剩余内存(pages_free)在一个小范围内不停地波动。当它小于页低阈值(pages_low) 时,又会突然增大到一个大于页高阈值(pages_high)的值。# q' `/ e, [4 p( c1 s

2 Q& M- ~  S& p" g( V/ H& F: x再结合刚刚用 sar 看到的剩余内存和缓冲区的变化情况,我们可以推导出,剩余内存和缓冲区的波动变化,正是由于内存回收和缓存再次分配的循环往复。. r- f% w1 R+ W5 B& n

$ ^; K- U/ I, O* J9 ?/ @当剩余内存小于页低阈值时,系统会回收一些缓存和匿名内存,使剩余内存增大。其中,缓存的回收导致sar中的缓冲区减小,而匿名内存的回收导致了Swap的使用增大。* p$ u, u2 D* \5 v
- f9 V" Y7 A% a* E( ?4 ]! ?
紧接着,由于dd还在继续,剩余内存又会重新分配给缓存,导致剩余内存减少,缓冲区增大。
, O  P- z' N" U7 n( V) Z' F1 ^
4 A& a8 p- l- n. l; P, G/ A其实还有一个有趣的现象,如果多次运行dd和sar,你可能会发现,在多次的循环重复中,有时候是Swap用得比较多,有时候Swap很少,反而缓冲区的波动更大。) M+ i  ~  r) B2 e) o, I8 R5 g

7 R$ h. [% `7 |* M换句话说,系统回收内存时,有时候会回收更多的文件页,有时候又回收了更多的匿名页。0 D! D9 G8 u4 `5 _

; h0 d/ b+ K5 C# X* [3 x& t3 k显然,系统回收不同类型内存的倾向,似乎不那么明显。你应该想到了上节课提到的swappiness,正是调整不同类型内存回收的配置选项。
! P5 h' j3 V  G+ {! i* Q
3 s. s9 ?9 ~/ h! @* f( ?, z2 S. J查看swappiness的配置" V1 E7 b9 L+ O% S& G, y+ U
# cat /proc/sys/vm/swappiness : w! K. ~3 ?: l. h8 v. ~/ s5 I
+ F! |) j) |& P
60
. W7 f: _* W- y2 l6 H/ zswappiness显示的是默认值60,这是一个相对中和的配置,所以系统会根据实际运行情况,选择合适的回收类型,比如回收不活跃的匿名页,或者不活跃的文件页。: F* I0 F2 r' e1 Q- K
# x$ z! u1 R4 v% V

* l: G# D+ Y0 \5 l到这里,我们已经找出了Swap发生的根源。另一个问题就是,刚才的Swap到底影响了哪些应用程序呢?换句话说,Swap换出的是哪些进程的内存?
+ _5 L; o9 E$ O) P$ m4 [4 V
- U; {- h0 J7 ^  i, d
+ J* X+ s( ^' K' r1 i# w
这里我还是推荐 proc文件系统,用来查看进程Swap换出的虚拟内存大小,它保存在 /proc/pid/status中的VmSwap中(推荐你执行man proc来查询其他字段的含义)。: D( H: D. s: Y1 O2 J8 v
+ K4 v4 Z+ w- K0 W
' o& n/ P' G! |- h7 Z. ]
在第二个终端中运行下面的命令,就可以查看使用Swap最多的进程。注意for、awk、sort都是最常用的Linux命令,如果你还不熟悉,可以用man来查询它们的手册,或上网搜索教程来学习。
7 y! F8 ^% W) w0 W1 c$ I0 r
  s# G9 e1 x4 I, I# gfor file in /proc/*/status ; do awk '/VmSwap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 3 -n -r | head/ g* ^+ q% C9 l) E" V/ k) S% E' z
dockerd 2226 10728 kB+ L0 ]1 q. B4 x6 t9 s% a
docker-containe 2251 8516 kB
# T0 M; J- [) c/ S, |snapd 936 4020 kB
# F4 d, W  Z0 g# Cnetworkd-dispat 911 836 kB* h/ @( N& V8 J+ v0 b
polkitd 1004 44 kB) s# O  ~6 j2 s4 J! o- V. ]# Z" o
) M4 Y: I4 `  E% t& Y1 u
* O5 w# R$ e9 b2 r
6 }8 p! V7 }) j& r6 l% A; z

5 W. s( h# n" p- _# @也就是说,你的内存在使用到100-60=40%的时候,就开始出现有交换分区的使用。大家知道,内存的速度会比磁盘快很多,这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。
+ Z* a1 D5 {# }1 _2 H  |" I3 T- |$ ?5 I5 p' F  P
临时调整的方法如下,我们调成10:
4 l; L7 d$ m) _
, G& i5 `; ]' w& R7 Xsysctl vm.swappiness=10" E  R" f( u- X" r
cat /proc/sys/vm/swappiness/ g% W' S) z7 }; G
10
; q4 G/ G! h+ `" s2 X" K$ j& Q( I% `
这只是临时调整的方法,重启后会回到默认设置的$ G  W, V) c- `& m0 K

8 E% G5 m5 x9 X" q5 b" N( I! [1 f+ ?要想永久调整的话,需要将在/etc/sysctl.conf修改,加上:/ U+ U1 ^4 ~# Y0 T3 w
( U/ \& s  Y0 K
cat /etc/sysctl.conf
# M6 @' k+ q+ J5 v+ Q$ w% gvm.swappiness=10
2 ]: i# X/ O# ^
' _$ ?: q* l' U7 d  q) w7 c$ S
解决方法:( d; Q; q* w% t0 q6 c& `
1、调整swappinness参数
$ J) @% A4 T; |. _! x9 J6 O; `' b* M- b
临时调整) b2 u; _( i: D$ k6 x
# sysctl vm.swappiness=30
: T9 b4 l: P( nvm.swappiness = 30
8 o# y1 y  o. j6 ]; T; f
+ R8 G. ~3 o8 t0 m; X+ Q- H6 D# cat /proc/sys/vm/swappiness
7 K0 o9 Z5 J* ^+ O6 s" d- M30% \& d) G0 b7 Y& Z
6 k7 e* Q' }. y$ S/ C$ c
永久调整:
) g9 v4 b' I! v设置8 m$ J# _4 A" E7 F4 k
修改文件/etc/sysctl.conf文件
1 Y% J. O# f$ Dvm.swappiness = 30
$ e  B/ T' Q8 d9 N, x# P1 [! B* M生效
  j+ I- G1 b& f5 @3 S7 Y3 Rsysctl -p
  ?+ `$ k3 `+ q/ C1 U: C" a0 t# ]! i4 t) v+ c
2、调整swap空间7 U" n6 W9 K) G

+ c3 j( K' ^3 [) T0 u5 H6 }* t1 c/ ?
使用dd 创建swap分区
& U8 X5 Q2 F1 @2 [" a- B; fdd命令创建sawp文件:
9 c4 {, [9 R, ~5 l; c; R: I! P# dd if=/dev/zero of=/swap bs=1024 count=1024000* ^, K% x1 P$ I) V1 k- S
1024000+0 records in$ W' h# m" q+ p: s
1024000+0 records out
1 n6 [. V3 b: w! e$ T1048576000 bytes (1.0 GB) copied, 2.14338 s, 489 MB/s
: v# t( n7 s5 C#
' }6 `; n: h' C2 M' K3 s3 y# T1 ]# f$ ~" n* {
制作为swap格式文件:
( _/ H* U* C3 v. o: `. c( i' l. e7 w4 s* C% K; r3 O! ^* m
# mkswap /swap6 \( H! q0 c2 D) x+ ?5 |
Setting up swapspace version 1, size = 1023996 KiB* J) `/ P9 X( i/ X2 W: x' j
no label, UUID=2fb7fd7c-d5aa-451b-9766-5acb72dd6990
; U1 s4 v8 ^, q6 g# c1 L6 N2 h
7 I- K( d- Q) p7 B, _8 c( n+ ~/ m: q+ K" U, Y# ~  f
3、再用swapon命令把这个文件分区挂载swap分区+ g: \: j0 m/ P' _1 @2 }2 }
# swapon /swap
6 f5 L9 O. `2 U1 lswapon: /swap: insecure permissions 0644, 0600 suggested.
8 `( G9 s3 @9 J* x; O( }
3 [. G# c4 U7 s. R* m1 h; `1 t7 v, x0 g
  X9 u) B# P, Y
4、为防止重启后swap分区变成0,要修改/etc/fstab文件
5 A& \+ y) T( ~* hvim /etc/fstab! K2 i) `* F- J
在文件末尾(最后一行)加上:' m7 E" o1 f! U* f/ v
/swap swap swap default 0 0
6 V& O% s( H1 i6 ~8 e3 U- k5 W( {, A& C; b: z3 ~1 r$ l
mount -a& \7 q2 [4 j) @( L) @

/ e' C4 K# k( B' z7 J扩容swap 分区:, F- L  B. a* `- C3 ]' F* L
[root@kvmvm ~]# swapoff /swap$ O& C6 a5 y) [. Y. O4 O
! P& t+ B  U9 [
# dd if=/dev/zero of=/swap bs=1024 count=1048000
4 A" _( Z6 e/ l' T) ~1048000+0 records in
# r7 q- h* k7 r) G: U+ K1048000+0 records out- X0 E2 A# g6 ?$ p4 p  S5 p
1073152000 bytes (1.1 GB) copied, 12.6694 s, 84.7 MB/s  E1 d, p/ b. S' {1 d8 `0 n
. ~9 X9 c" g5 e& u# R, N' N, w( m- U
# dd if=/dev/zero of=/swap bs=1024 count=2055000  N& e% u1 n& ]
( T1 u: ]6 K. \+ a2 }+ E
#  mkswap /swap4 h9 f( a7 N4 @+ F' L
Setting up swapspace version 1, size = 2054996 KiB' c! G) s" Z6 a. O( ]
no label, UUID=8dd77b7a-744a-452d-b991-5b2e01702464
* R: u3 p; I) _" U5 V( H, E! `, F
( I4 x# J9 l9 Q1 }4 L. r# X# B
) A$ g+ G; B( [4 n6 w, Q' N" L# R, ^# swapon  /swap+ l5 \  q: D- V7 B* K% Q: G& C
swapon: /swap: insecure permissions 0644, 0600 suggested., k6 D; F4 g  E% I" L
swapon: /swap: read swap header failed: Invalid argument
; ~7 \5 `. B6 g: c/ |  X! Q& y, O3 \/ w" Q4 ^$ g  B
# mount -a
5 Q* K/ G8 [0 P; M* v" I: }! n( V5 w" @  I# i9 r, q: T/ |
              total        used        free      shared  buff/cache   available: {3 I% L+ B, r0 I! [: w
Mem:             31           1          27           0           2          29% E4 x5 O1 y. ?+ N, O5 Q& M0 V% a
Swap:             1           0           1
; W% i5 T/ _7 O3 z/ @; l2 e. D free -m# b3 ]  s: r  a, U
              total        used        free      shared  buff/cache   available' q( H+ S  `4 l- m% F+ k
Mem:          32011        1037       28171           8        2802       30595' J7 O: H. U! \  ?
Swap:          2006           0        20068 m- a* w" x8 H" B  J! L
* x2 f4 D9 Q! Y  P
可参考这个值:
( Q2 }( @  e  s" O' \* k1 [7 i1 D) D5 j# `2 p
https://www.bbs168x.cn/forum.php ... &highlight=swap. ~) j9 k6 d0 H, g2 S; V5 A

3 W# U: u+ @0 N4 |# v! ^
2 q& L8 G) r6 i2 H0 o" q# `8 F
$ L7 f5 @1 R5 C1 `; R3 ]" F$ a# ^9 ~

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=10- w) e5 m/ m( l" S  O+ O$ S. u
vm.swappiness = 10; X  D8 r. g% C5 [4 R; J

, t- e: K  N0 K7 Y[root@jenkins-01 ~]# free -m
8 j  d3 ~: j; p$ V* J  f1 E              total        used        free      shared  buff/cache   available" {+ O& T; u; S  h
Mem:          15880        5080        7093          27        3706       10441
7 p  Z/ j9 |' bSwap:          2047        1952          950 n( y# Q" e( q. U

( {  S& D! l( m: Z$ q3 X- F# ?设置了感觉没有什么效果。

70

主题

73

回帖

1201

积分

网站编辑

积分
1201
发表于 2025-2-27 10:54:33 | 显示全部楼层
(3)操作释放步骤: O# ^7 m& e7 j6 X; F) }
(a)swapon -s查询挂载的分区,记住这个名字name,比如名称叫/dev/dm-1' X( l6 ?+ h4 _* E+ K# D, B
1 v8 V9 t! \- R, C, I
7 p3 D3 y4 R# W# g: J' I
(b)关停这个swap:swapoff /dev/dm-11 X" g/ j. C6 W+ e# S
(c)需要等待关停结束,需要等待比较长一段时间,可以通过free -m查看什么时候swap值为0即为关停完毕# d) f* ]6 _% i
(d)也可以用swapon -s看下是否关停完成' C4 z- q4 a, s0 w1 i4 y! Q2 r
(e)重新挂载:swapon /dev/dm-1# x& w* ?" q8 J. ?9 Q' Z: x& b
(f)通过free -m可以看见挂载完成,swap占用内存释放完毕% [" F5 L" k6 x) `& n* B- w6 h

70

主题

73

回帖

1201

积分

网站编辑

积分
1201
发表于 2025-2-27 10:55:37 | 显示全部楼层
# swapon --help $ _: H2 m; r/ h, b: g. o
1 y" w/ c8 x/ I/ e) d
Usage:
8 x$ l6 x; S3 _" H# r8 Y/ E swapon [options] [<spec>]2 o, x/ r" T" t, s- w

' h( L) H& q  d( z1 bOptions:
9 O7 d2 K3 ^& V4 ~; c/ |* Z8 ` -a, --all                enable all swaps from /etc/fstab: ]2 x! e, t: k4 o! c5 L4 q! f
-d, --discard[=<policy>] enable swap discards, if supported by device
# z; z7 O1 j8 J5 |1 d) h -e, --ifexists           silently skip devices that do not exist& O& U8 E  D7 o# T& k1 u, [0 W
-f, --fixpgsz            reinitialize the swap space if necessary8 |  c6 x% m+ b% ~% P7 H3 y' @4 b
-p, --priority <prio>    specify the priority of the swap device4 W# _+ P8 |% ]! b" W
-s, --summary            display summary about used swap devices, y/ z! f4 d$ i) _. e: p4 \
     --show[=<columns>]   display summary in definable table7 Q! n5 S7 p! J0 k
     --noheadings         don't print headings, use with --show
9 \4 m# x' J! K( z  g     --raw                use the raw output format, use with --show
0 }6 y$ n% J0 U" }     --bytes              display swap size in bytes in --show output
8 g' B, @* U* n+ P8 q; r- ^  z -v, --verbose            verbose mode
+ a6 r- [% @; P5 H. J* u' e- q' @7 W0 F: B9 r$ w; {$ [' Z. U
-h, --help     display this help and exit9 ]3 |' Q5 c% }' c+ r$ T
-V, --version  output version information and exit! Y+ G$ f# Y' I7 {4 d: r5 h1 D
3 d( t) W! \& t  r  ]
The <spec> parameter:7 D* v  M' G$ _* M7 q" r- v
-L <label>             synonym for LABEL=<label>
" v8 F0 M; s! b -U <uuid>              synonym for UUID=<uuid>
' Q3 S( O* w! Y! `/ B, K LABEL=<label>          specifies device by swap area label/ P& b+ I+ ~* t0 m; ^2 }& n* K9 @
UUID=<uuid>            specifies device by swap area UUID
2 [3 s/ U6 [( K9 u1 B PARTLABEL=<label>      specifies device by partition label
1 w$ |: H" ]/ K3 H' }- g PARTUUID=<uuid>        specifies device by partition UUID
9 [% Z, U$ w1 C$ U  M9 w <device>               name of device to be used
0 z) O7 V) N1 u* a% l <file>                 name of file to be used/ S- }: E6 o6 R

% \7 F' ^1 t& b/ p, LAvailable discard policy types (for --discard):' V$ r7 i. T- K7 N2 y2 H
once     : only single-time area discards are issued. (swapon)4 U0 @+ m# q. v9 N& J
pages    : discard freed pages before they are reused.9 l4 |, o$ l4 D7 r! ?- M
* if no policy is selected both discard types are enabled. (default)
5 m$ d3 ~) @% T+ L7 u
8 C$ f( D4 v8 x/ Q+ P- iAvailable columns (for --show):: E3 ~" w' C4 \  \" R
NAME  device file or partition path
+ h! u. N# u5 Y  G4 J TYPE  type of the device$ @# m& D6 {* l4 t+ f3 r
SIZE  size of the swap area$ r0 q3 _$ z- {2 Q: D7 g/ _) z5 S4 b
USED  bytes in use4 k7 `5 W6 t! E8 @
PRIO  swap priority
+ b, e. z' o) H2 @+ R6 A- R/ G
& k* ]' _* I, ~% IFor 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
! [4 v, g2 T" U$ @5 T0 M( I4 tcat /proc/sys/vm/swappiness
  z1 t; E  e' |& X6 ~! D: J# V, Q$ ]这个设置了,不生效。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 00:47 , Processed in 0.013701 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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