易陆发现互联网技术论坛

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

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

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

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

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

x
遇到swap分区使用过高的处理过程) A+ g! x. p3 e9 V3 R7 G$ o
[root@devops-prod-jenkins-01 ~]# free -m
1 R- K/ h, A. j5 _$ o7 `' N4 [              total        used        free      shared  buff/cache   available
: V- b6 g0 {+ s, U, KMem:          15880        6479        3147          36        6254        9034& a' W; b0 `/ M- x* f* p- E1 z" o3 e
Swap:          2047        2034          13) |! E. [) N& U) l& b0 J

4 j- Q% R: a: u! t% C+ V9 i& a& F- c/ j& l* w
+ }; `; i8 l4 r
观察 /proc/zoneinfo 中这几个指标的变化+ E3 n) D( p' {8 W. y* Q) e
watch -d grep -A 15 'Normal' /proc/zoneinfo
6 v/ B3 f# z: P  u! l
( S* E% N- X' X' kEvery 2.0s: grep -A 15 Normal /proc/zoneinfo                                                                                                                                                   Thu Feb 27 10:09:19 2025
3 n  v4 O2 K, `0 m5 e6 |: E: A  i. l+ y, C7 N, t8 n3 A
Node 0, zone   Normal
# z* ~& p% m# `& _1 o' R  pages free     120551
3 [( j+ P8 w% A        min      13867
: e$ F' V5 x7 @$ A3 t: {* y        low      17333
' ~% f% S6 L; h, m' r7 `: j4 {        high     20800
! |1 }, X/ P" g        scanned  0
0 s" r8 v7 c& ]. q1 Q6 m5 g: b6 ?        spanned  3407872' U3 T( l4 R. V  _! @# l4 b
        present  3407872& `. _- u( b4 y5 j- ?
        managed  3336797
7 x; ~) O( _2 H3 c6 L; d    nr_free_pages 120551
/ S% O/ w! E: E$ ~  A    nr_alloc_batch 8289 \9 i  G8 x" h+ B
    nr_inactive_anon 315091
4 p: b1 w" {1 Y# R    nr_active_anon 1485863
- Y: s; q; p; c' o( i    nr_inactive_file 442039
' s4 l) ^( K* c7 C3 s    nr_active_file 5073318 i. H* U# Q5 N1 T; |# ?
    nr_unevictable 0
& n) }# Z' M0 |2 o: `9 M) @7 A
, r( Z& W# h" k" H$ B1 L+ X剩余内存(pages_free)在一个小范围内不停地波动。当它小于页低阈值(pages_low) 时,又会突然增大到一个大于页高阈值(pages_high)的值。& K; U% U6 T* n$ u" E
5 L1 t9 \8 q4 z; M$ c- t/ N
再结合刚刚用 sar 看到的剩余内存和缓冲区的变化情况,我们可以推导出,剩余内存和缓冲区的波动变化,正是由于内存回收和缓存再次分配的循环往复。5 l' Y$ \' Y* w# P

9 d4 X4 A" B- q7 S( E. ^当剩余内存小于页低阈值时,系统会回收一些缓存和匿名内存,使剩余内存增大。其中,缓存的回收导致sar中的缓冲区减小,而匿名内存的回收导致了Swap的使用增大。
+ M+ R2 B7 m1 Q# C
; `; g; r' G% o紧接着,由于dd还在继续,剩余内存又会重新分配给缓存,导致剩余内存减少,缓冲区增大。
, T1 n. Z$ J) I2 J  q& A$ G9 @/ U& r$ O8 U
其实还有一个有趣的现象,如果多次运行dd和sar,你可能会发现,在多次的循环重复中,有时候是Swap用得比较多,有时候Swap很少,反而缓冲区的波动更大。
7 c% x, n$ m* s1 F* o/ U5 M3 s' C- N: H5 `; K4 \
换句话说,系统回收内存时,有时候会回收更多的文件页,有时候又回收了更多的匿名页。4 z9 l- [" c" z( X
7 P: q3 a7 _) P4 e
显然,系统回收不同类型内存的倾向,似乎不那么明显。你应该想到了上节课提到的swappiness,正是调整不同类型内存回收的配置选项。
( _) P" Q: l* P; T7 n% O  O$ V, X. m) C0 D
查看swappiness的配置
/ v2 d! C. R8 ^3 u6 D# cat /proc/sys/vm/swappiness ! z' w3 m* {% J
% k. `8 }  @  N* Z, ~
60( {& p/ ~' a# }' W# Q
swappiness显示的是默认值60,这是一个相对中和的配置,所以系统会根据实际运行情况,选择合适的回收类型,比如回收不活跃的匿名页,或者不活跃的文件页。. U9 X* q) o, ?; U

+ y, B% O* ]3 v: f

3 o3 i9 L+ N( Z2 J到这里,我们已经找出了Swap发生的根源。另一个问题就是,刚才的Swap到底影响了哪些应用程序呢?换句话说,Swap换出的是哪些进程的内存?# I# S5 [7 k" h5 b4 m
  O2 H- u2 \: s
2 i" M1 Z8 O8 ?$ Z. f5 X+ o' d
这里我还是推荐 proc文件系统,用来查看进程Swap换出的虚拟内存大小,它保存在 /proc/pid/status中的VmSwap中(推荐你执行man proc来查询其他字段的含义)。7 l2 Z" r8 i( b( h- L3 {* o2 |
; B7 d7 n, g3 R8 }
& A( M4 {  `) b! b
在第二个终端中运行下面的命令,就可以查看使用Swap最多的进程。注意for、awk、sort都是最常用的Linux命令,如果你还不熟悉,可以用man来查询它们的手册,或上网搜索教程来学习。
  H  C& W' _( a; X3 [
! D& }- _: f* Y) hfor file in /proc/*/status ; do awk '/VmSwap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 3 -n -r | head  g' p- m0 n3 W* @; f9 o  k
dockerd 2226 10728 kB
; t; W) U/ H( _3 {; T+ X' f( e! Fdocker-containe 2251 8516 kB: R$ a( e: n! `# |, `4 D
snapd 936 4020 kB
+ {( E: I4 G% N' J4 Snetworkd-dispat 911 836 kB
6 W/ [5 L8 _+ l7 opolkitd 1004 44 kB) X9 S' g: S+ Y* ?. C

# R! p: U" w8 i* Q4 E5 z' T
0 |" S7 Z5 G; L4 m* v- O2 J
5 z2 V9 u6 B8 z* P# K3 ^8 `4 \

( G' M# r. g( r& i8 R% n也就是说,你的内存在使用到100-60=40%的时候,就开始出现有交换分区的使用。大家知道,内存的速度会比磁盘快很多,这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。; A1 |5 E! q* W6 `2 @; x

# l: M: t/ @- m7 T3 m; E临时调整的方法如下,我们调成10:1 G% i. }1 p# X/ u8 M( r

6 q6 R  G+ u9 \8 D% u5 M' p! z, S$ Rsysctl vm.swappiness=103 K9 e  t6 D& D; y4 W+ e
cat /proc/sys/vm/swappiness
# n6 o  L1 ?6 |5 e0 |10
$ P% W, W% t/ }: w1 ~  `; }! k. V& D2 i/ h; A
这只是临时调整的方法,重启后会回到默认设置的; Z- N6 o. t# h! g; N3 c2 Z

* D, u' H7 j, I$ X要想永久调整的话,需要将在/etc/sysctl.conf修改,加上:% _; ~7 O# a" @' D$ u+ I% Y
( @/ F  E# q0 M$ b7 r, z1 d& q
cat /etc/sysctl.conf
# I* H% ]' `4 t+ v. C; Fvm.swappiness=10+ l5 H% K% }7 S/ r
% ?+ Q) c7 l& q) B* \3 A$ _* j

/ ~) r, g  x; K% d5 m" w解决方法:
# p: Z7 Y+ K+ ]1 Z1、调整swappinness参数" X7 ?1 \  l! b% k

) f8 {% f* x: K" u' ]# b: G临时调整, |" Y9 F7 v- x$ Y# w
# sysctl vm.swappiness=30
. y% M0 ^( _* ^% M/ Rvm.swappiness = 305 k/ x2 ^0 i8 V% F6 t; h

. N! u( I: }& P1 t: T  h2 n# cat /proc/sys/vm/swappiness
. o' \. J3 h3 u( z6 l2 M30
6 e8 D0 q! ^; R6 T& v! }$ _! X- p9 F: k; m& w5 R6 M. r
永久调整:! y( M- k1 P3 f% A. E# Y
设置
7 a" l; V% O* T. r5 T修改文件/etc/sysctl.conf文件
0 [) p9 |$ u% `vm.swappiness = 30
$ D" j$ I* u6 I/ W& G1 z生效
" i# o) s  J" w. p7 N/ e; bsysctl -p: C% L0 E- j- F3 ?. y/ W- F( X

8 n, f! ^; Y2 z) y$ w1 m5 i) O7 O* }9 c2、调整swap空间
. d+ ^9 o: [! s* B/ }5 u% j6 S% W( x( f* L4 s$ y! L; T' B
使用dd 创建swap分区
$ I0 l  j- U. E) ~% T+ h0 Xdd命令创建sawp文件:
& l5 U' E. ]+ ~6 x3 Y& m# dd if=/dev/zero of=/swap bs=1024 count=1024000% w* r3 g5 X1 x; q3 t- m* C2 Y; N5 I
1024000+0 records in
% E/ s8 Y' ^$ u& f* L1024000+0 records out
- U* i. w4 X0 y. A& X  V& O. a! I1048576000 bytes (1.0 GB) copied, 2.14338 s, 489 MB/s, [4 J# h& u  H4 P3 O2 \) _6 |8 H
#
3 g% B1 J' M. [) Z9 q$ r8 I( N3 Y2 J+ s$ S
制作为swap格式文件:
& s4 B" ^3 d4 M1 a0 J; O3 |7 e2 ]3 d+ V9 u
# mkswap /swap1 p8 _/ ]8 j% ^" G& d7 P% u
Setting up swapspace version 1, size = 1023996 KiB
. B! Z/ I+ e( Y8 J/ cno label, UUID=2fb7fd7c-d5aa-451b-9766-5acb72dd6990
& k8 Y; \) [% t. s4 m9 B
( ~" ~1 Y: m+ P* \- x% Y$ ?8 g' M6 l
; Y5 i1 l# e8 n+ b5 v3、再用swapon命令把这个文件分区挂载swap分区
. R  y9 b# X8 ^# x! P# swapon /swap
. ]( @! t3 N3 X' ^4 E  e  aswapon: /swap: insecure permissions 0644, 0600 suggested.
! z! {: e  X! y/ X8 I
) F2 F* P) V3 g1 p7 Q/ X+ n: D' K: ?% b, i' p

7 ^8 z7 q9 [% H! Q% ]* {4、为防止重启后swap分区变成0,要修改/etc/fstab文件
" p& U- \; z4 P. ], s0 e% Cvim /etc/fstab# n& r0 r  z: w: E2 f2 H
在文件末尾(最后一行)加上:
* x6 f% d; B5 z% f/swap swap swap default 0 0) }+ p! e, P9 f# N

, O) K+ x6 s/ ~! q3 b2 u+ Cmount -a6 M. L" D4 {1 `7 b: ~9 E! X5 U6 q
$ Z# D& y  u" Z- {  M) ^, G$ v
扩容swap 分区:
! |$ Z. h- k) Q[root@kvmvm ~]# swapoff /swap! N+ H, m. V+ x" W

6 C: @% j, `/ u# A& D# dd if=/dev/zero of=/swap bs=1024 count=1048000
5 x+ Q3 B. ^+ O( Y8 B/ A1048000+0 records in; V% w& s8 u- |; S% D/ F
1048000+0 records out
2 A1 N: q- v. }7 Z! ~4 d, A) e1073152000 bytes (1.1 GB) copied, 12.6694 s, 84.7 MB/s
8 s& U7 l& J; e$ j- P
: ^2 P$ W- ?* Y. x5 t# dd if=/dev/zero of=/swap bs=1024 count=20550002 D( ]* `  J" J  E6 t

6 N/ D' ?) H/ [; ?* k#  mkswap /swap
6 S/ I3 i# A: MSetting up swapspace version 1, size = 2054996 KiB2 e: T9 Y5 D8 H
no label, UUID=8dd77b7a-744a-452d-b991-5b2e017024644 Y, u9 j! T& w
$ E3 ?3 {, w$ O

& F* N2 d" B3 O# I2 B# swapon  /swap2 R. Q- M0 h+ b5 e) F/ B  n
swapon: /swap: insecure permissions 0644, 0600 suggested.; Q( p) c! F7 {( C1 ?! P
swapon: /swap: read swap header failed: Invalid argument. v) ^. \. y  @  {$ P% O! W
2 G% k: H3 j6 N/ b$ {# o
# mount -a
+ G. i8 M, A, u: j# C' J
& Z+ G4 l0 d& _( p              total        used        free      shared  buff/cache   available4 V$ |. ?8 v' ^, q. O4 N
Mem:             31           1          27           0           2          29' m# [5 R% Y$ d/ h8 T( v
Swap:             1           0           1/ ]* }) p! ]5 ^  W. y. B
free -m: S' O7 E# W$ K9 w4 ~/ r
              total        used        free      shared  buff/cache   available* m* o3 A9 a$ _
Mem:          32011        1037       28171           8        2802       30595! [4 v2 h6 \) p& s
Swap:          2006           0        2006
) g  I( X/ f7 R( c
8 E- @8 b. n/ a+ r2 G7 l( j( h: l3 c5 v
可参考这个值:
$ U) G' I1 Y+ r4 L" d/ T3 [4 A% R5 [- J4 N; r' m# m
https://www.bbs168x.cn/forum.php ... &highlight=swap
' L. C# ~& h' z1 U2 T. t/ C) H- z. r$ V) s7 i

) X$ b0 l" V# [: J, g
& X4 ~& J8 M7 n  I$ o8 \4 s% B% L+ A5 ?5 H3 x+ l$ h8 ]% G
 楼主| 发表于 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' E6 ^5 X2 @. |$ ]
vm.swappiness = 10* O9 I  J% V4 b" ~1 C
7 l& t0 d- y8 F5 A- c
[root@jenkins-01 ~]# free -m
7 E" ^0 a/ a/ x7 l              total        used        free      shared  buff/cache   available
* @4 ]$ e, S9 G7 t, B: wMem:          15880        5080        7093          27        3706       10441
0 F: K4 l1 Y* x& w, c7 ]; MSwap:          2047        1952          951 {  w* i4 n: H; D( w8 U

2 v: A5 o2 {! q  r1 _设置了感觉没有什么效果。
发表于 2025-2-27 10:54:33 | 显示全部楼层
(3)操作释放步骤
6 h( w( ]" b5 d7 c; Z(a)swapon -s查询挂载的分区,记住这个名字name,比如名称叫/dev/dm-1
1 q) _; ^3 C7 ~+ O- r0 ~3 M" ]4 J. v
5 P. p7 R2 n$ r. a$ A0 B
(b)关停这个swap:swapoff /dev/dm-1
: |9 P) s% l! S% I0 }3 T(c)需要等待关停结束,需要等待比较长一段时间,可以通过free -m查看什么时候swap值为0即为关停完毕/ P! o$ k7 ~& h1 k  T
(d)也可以用swapon -s看下是否关停完成; S5 Q5 D. I, r3 _* r+ F$ k
(e)重新挂载:swapon /dev/dm-12 y* p6 W1 }5 O0 g( d
(f)通过free -m可以看见挂载完成,swap占用内存释放完毕
5 c: Z; R2 d  J4 n$ @, K# h) Y
发表于 2025-2-27 10:55:37 | 显示全部楼层
# swapon --help
& y# u: [, u: _8 A$ q! Y5 E+ a4 B$ q8 @+ E- F0 O
Usage:5 Y6 J) a, e3 l
swapon [options] [<spec>], l. r- W5 C* Q% V
0 W1 z% i# f! L. a- f
Options:2 ]3 B5 M6 y/ T3 R
-a, --all                enable all swaps from /etc/fstab  _4 c! e' _6 N% L, @6 U( U
-d, --discard[=<policy>] enable swap discards, if supported by device% u) L- d  {: m+ `. L
-e, --ifexists           silently skip devices that do not exist
/ o/ l/ W# |3 i% Z -f, --fixpgsz            reinitialize the swap space if necessary
: c0 Q+ g" X9 o; J3 {6 k -p, --priority <prio>    specify the priority of the swap device
7 @: O$ s2 d9 B4 L4 b$ B -s, --summary            display summary about used swap devices
0 ?1 P6 d& j2 ?* p* K7 R     --show[=<columns>]   display summary in definable table
! A4 ~  L7 p: u9 z/ E9 V' ?9 {     --noheadings         don't print headings, use with --show# D$ C- T* ~; s% b$ d
     --raw                use the raw output format, use with --show( w8 j" [  ?" @
     --bytes              display swap size in bytes in --show output
- E$ d% |1 q) V$ j -v, --verbose            verbose mode
2 }1 _  s7 t! X- {0 H  D
+ v% i: P/ h3 V -h, --help     display this help and exit% U! Y/ a: D, U4 c1 b, a
-V, --version  output version information and exit1 k9 {8 Z- V7 z/ W% f6 C4 D2 a
* V6 p* @! n1 y' g
The <spec> parameter:& E! J4 Q, h$ A" W2 T6 t6 t9 ~
-L <label>             synonym for LABEL=<label>
8 o, h$ v, M- I3 ?# @ -U <uuid>              synonym for UUID=<uuid>0 h2 N6 B5 c2 F1 `( F( n- T9 Y
LABEL=<label>          specifies device by swap area label
9 H# ~" ^* r. _) m+ n  | UUID=<uuid>            specifies device by swap area UUID
8 j' H6 c2 L( s+ x; a PARTLABEL=<label>      specifies device by partition label
. {1 o5 N5 `- i PARTUUID=<uuid>        specifies device by partition UUID
. ~* W! l2 @8 C/ ] <device>               name of device to be used
: X9 A; e) W- f. T8 p <file>                 name of file to be used5 `( _, ]) |( f7 f6 [

9 ~% ?! W' X5 Z8 ?Available discard policy types (for --discard):2 h  b2 ~! K+ A- |9 U3 L7 C
once     : only single-time area discards are issued. (swapon)0 g9 X" U  R/ Y
pages    : discard freed pages before they are reused.* H% O3 i/ h( v0 g/ L5 q
* if no policy is selected both discard types are enabled. (default)
! T' E# N& Y6 O" O9 d, H/ K3 G4 O9 M7 Y9 S0 i2 H3 \
Available columns (for --show):
" @) G; A1 H! t NAME  device file or partition path8 v# U! i5 P3 x3 S
TYPE  type of the device7 A! X0 ]0 z9 V6 g+ R  l5 X7 b
SIZE  size of the swap area
- I* Y! m2 B) K8 b3 o) o4 E USED  bytes in use
! e4 r; s9 X2 q7 [; C PRIO  swap priority/ w- v7 u+ |! U4 I1 ^+ V) C% a

  h+ ~; @1 m1 z; b; hFor more details see swapon(8).
 楼主| 发表于 2025-2-27 10:56:32 | 显示全部楼层
生产环境有的操作还不敢执行。只能先记录操作。
发表于 2025-3-1 22:00:45 | 显示全部楼层
sysctl vm.swappiness=10* u: X9 D$ o: Q/ a4 b2 s
cat /proc/sys/vm/swappiness
9 g8 K( d7 P$ Q4 N4 E- F9 t- {; m. b! g这个设置了,不生效。
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

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

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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