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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2025-2-27 10:23:41 | 显示全部楼层 |阅读模式
遇到swap分区使用过高的处理过程) \; u" N: Z/ Y1 }  t% C
[root@devops-prod-jenkins-01 ~]# free -m
% s6 u( C' y+ E8 q              total        used        free      shared  buff/cache   available+ H$ a& f3 r% e
Mem:          15880        6479        3147          36        6254        9034# @1 ?8 _8 e  F" e7 a
Swap:          2047        2034          13: g! @: A$ B& y" i5 q" M
( i0 F# y, H' w6 }

- x3 D' Z' e# [/ A9 |1 i. n( E9 t' d* k
观察 /proc/zoneinfo 中这几个指标的变化
0 [& X" g6 F. \2 w& Xwatch -d grep -A 15 'Normal' /proc/zoneinfo / X! j& v/ L! X( J2 V

! G1 q* J1 G/ ~, }0 k" @Every 2.0s: grep -A 15 Normal /proc/zoneinfo                                                                                                                                                   Thu Feb 27 10:09:19 2025
% |# e. f" h4 \; @! H& g: a+ Q4 X# b8 K$ j( B; g9 I
Node 0, zone   Normal: G! d3 M- m# Z
  pages free     1205514 J; o2 ?# s5 d" T2 C
        min      13867
; J9 z) c4 k# O- u, j. k        low      17333, r$ ~/ T( Z. Y$ ^, ^# Y! s
        high     20800
" u  ]* e) z% g, |& m/ u2 k) s  A        scanned  0
$ {9 I* G6 o) L. c. @$ p" Z% _        spanned  3407872
0 ?1 T5 Q5 @4 Z% O& B4 y- ?3 K4 W        present  3407872! v+ h+ `; k5 B& A6 [% V
        managed  3336797* G- F( G8 y' S( v3 X- M+ U
    nr_free_pages 120551
9 a8 b: V  V! O5 ?    nr_alloc_batch 828: \8 p5 _7 K8 O1 ~1 z" [
    nr_inactive_anon 315091
$ Q, G9 j9 u3 o) ]2 G# A7 _    nr_active_anon 14858633 d' |, M, D6 p7 n; S6 |
    nr_inactive_file 442039
, `3 y6 I' w/ I    nr_active_file 507331
% t: u! b$ D  N) }, O0 q# d    nr_unevictable 07 j8 m6 f! U# }, V0 w3 y  }

  x! U0 Y3 P0 i剩余内存(pages_free)在一个小范围内不停地波动。当它小于页低阈值(pages_low) 时,又会突然增大到一个大于页高阈值(pages_high)的值。( G' O6 X, d9 d+ _4 D/ S( j
! t& X9 y/ ~' K, p1 v/ w
再结合刚刚用 sar 看到的剩余内存和缓冲区的变化情况,我们可以推导出,剩余内存和缓冲区的波动变化,正是由于内存回收和缓存再次分配的循环往复。
, {1 m+ l# p. d7 k
5 W6 f5 M0 A& c' ~. g; a! Q. L当剩余内存小于页低阈值时,系统会回收一些缓存和匿名内存,使剩余内存增大。其中,缓存的回收导致sar中的缓冲区减小,而匿名内存的回收导致了Swap的使用增大。% T2 Z% H" [0 ~' P0 }0 z2 T
3 V! H) b" C4 ^6 o/ v) Z
紧接着,由于dd还在继续,剩余内存又会重新分配给缓存,导致剩余内存减少,缓冲区增大。
1 E; l! N1 S! R" V1 a3 o  k6 j1 E0 \4 k
其实还有一个有趣的现象,如果多次运行dd和sar,你可能会发现,在多次的循环重复中,有时候是Swap用得比较多,有时候Swap很少,反而缓冲区的波动更大。- P  U$ n( n  y+ m+ c1 c- [; @

# U; C; ?. Z0 p' e2 ?换句话说,系统回收内存时,有时候会回收更多的文件页,有时候又回收了更多的匿名页。
8 d% c" V; e) w! s
' ~7 h# ^% d) }) r! n  k显然,系统回收不同类型内存的倾向,似乎不那么明显。你应该想到了上节课提到的swappiness,正是调整不同类型内存回收的配置选项。& m1 S- l4 o7 j3 a: E

+ n0 `+ h! B/ g% z查看swappiness的配置
# E- O( l. @. g# I/ N4 T: o# cat /proc/sys/vm/swappiness
6 n; g& b1 I9 ]8 [( A8 k. |4 U1 k+ M) i; N, ]1 N  j
60
$ e% |' K1 a$ K3 T+ Mswappiness显示的是默认值60,这是一个相对中和的配置,所以系统会根据实际运行情况,选择合适的回收类型,比如回收不活跃的匿名页,或者不活跃的文件页。
' e5 m0 C8 r/ h& l# p" @* a( N, f7 O0 ]* T" Y& g; _9 m9 @8 G. I

( T2 S# X  m* ?' u. I3 `( |4 ?到这里,我们已经找出了Swap发生的根源。另一个问题就是,刚才的Swap到底影响了哪些应用程序呢?换句话说,Swap换出的是哪些进程的内存?1 h# V+ v/ v  G1 z! G; X9 B
$ A/ R* f) b- Y, A+ I$ H

) V) f4 D) x0 I8 e1 |0 e5 T. U5 _/ g这里我还是推荐 proc文件系统,用来查看进程Swap换出的虚拟内存大小,它保存在 /proc/pid/status中的VmSwap中(推荐你执行man proc来查询其他字段的含义)。
) R& D$ b* \: ]/ P' N5 t& n
$ u9 v5 g% ~8 w9 v& ?6 E3 m
1 E) Z  H( w  ~4 z! @4 R7 L, F% ]
在第二个终端中运行下面的命令,就可以查看使用Swap最多的进程。注意for、awk、sort都是最常用的Linux命令,如果你还不熟悉,可以用man来查询它们的手册,或上网搜索教程来学习。
' v, `: ?6 C6 V/ C+ Y* n( f3 j  G3 {" N7 I
for file in /proc/*/status ; do awk '/VmSwap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 3 -n -r | head
# c( r. c. |! d9 o3 {dockerd 2226 10728 kB  X5 c7 v# z7 D; u/ @+ S3 i1 n: g) i
docker-containe 2251 8516 kB7 Q* E* F8 F$ `+ G8 N+ @% T$ N3 w
snapd 936 4020 kB# E! W; ~# G  J. r. J& m9 _$ g, L
networkd-dispat 911 836 kB7 G7 N6 q  R) z
polkitd 1004 44 kB# u2 Z, l: s  i9 t9 b- U! ?

5 `7 g4 S1 X% p; X3 a' R: k6 e/ J2 [- k1 k% c/ a" j& Z

2 ^: [+ b! X! ~. B' V7 X+ z6 t- v& l- Q
  d/ Z) j( r! R
也就是说,你的内存在使用到100-60=40%的时候,就开始出现有交换分区的使用。大家知道,内存的速度会比磁盘快很多,这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。
% o; b' J+ ~3 ^( I1 f1 ^1 Y' t2 }  e! X+ P0 Z4 K
临时调整的方法如下,我们调成10:
/ X" \: P, ]! r) k( o- u
# O3 {7 @" I2 ~2 wsysctl vm.swappiness=10  f: o( N8 E0 D5 j" [" L7 y1 x
cat /proc/sys/vm/swappiness. {) E: S/ K1 ]6 ^, y
10* v- N8 F8 ]0 N9 g" h7 p4 B$ W

" C8 g* }" {" q: b2 u这只是临时调整的方法,重启后会回到默认设置的+ S5 H+ s* ^1 M% N2 e7 @# d
- `9 v3 z  U  x, g2 M4 q, R) Q
要想永久调整的话,需要将在/etc/sysctl.conf修改,加上:& Q2 o1 o( E9 K4 Q9 O
% U& }) f  F, P/ w: i) c
cat /etc/sysctl.conf
7 C! D4 x6 N& d  N5 W, ]0 q7 nvm.swappiness=10
, y- G$ i- X: m  e5 |: q
+ B6 I3 J% S* r6 X# H
: \; z6 e/ H% _' W, _: u3 ?6 L解决方法:
7 M$ A- j6 H, [1 T$ O: k0 W1、调整swappinness参数
/ Z! ]! I6 E' u: q$ _% r1 A7 e/ \8 r. ~' y  `
临时调整
! l+ G# U* Q3 ?# sysctl vm.swappiness=30
$ Z- d5 |! `% h0 X+ m+ xvm.swappiness = 30
) [1 u6 P0 h4 W; E6 @
8 e- Y( ^9 F0 [5 e& \# cat /proc/sys/vm/swappiness
( l, @" M+ P" t" q7 }308 D; R1 A& @  ~; C4 n

& q; Z* ~; \% p  L0 @! T  w# m4 R" K: M永久调整:
% N' z8 n$ q# Y8 w+ v/ c设置
( s5 }0 ?, L* ?8 Y! m3 F7 [8 y$ B修改文件/etc/sysctl.conf文件
8 n8 `, d+ H7 ^. j* evm.swappiness = 30
: r( _$ }9 z1 \& I7 s  P' z生效
) L' A! ?0 v1 Rsysctl -p
; o5 `& n: r! C: h: F7 ]! a: P1 }' `3 O9 n8 x8 ~3 Q( Y" e$ |
2、调整swap空间7 O! f* i( b5 x( @

4 a% w. v0 X& O1 j; X% [/ {
使用dd 创建swap分区
1 M5 i' k: Q! \8 Jdd命令创建sawp文件:
1 O8 D7 H4 b; y! d+ f& H& Y5 o# dd if=/dev/zero of=/swap bs=1024 count=1024000( p% r, ~& P1 j* p( A
1024000+0 records in) E# O* e* ]# |% ]: h
1024000+0 records out: j/ f, \0 a# @9 N) Z# _
1048576000 bytes (1.0 GB) copied, 2.14338 s, 489 MB/s. p* k" m5 W; r% f4 `6 y! `" e" K, Q& f
#; ~% g: L" ?' a2 }7 W5 |

( B+ U  |. g" p5 l9 v' }3 O, b; G; M制作为swap格式文件:0 \0 z" J, C: V2 l4 g* k
9 X: ^  V  u9 W4 H3 l8 K
# mkswap /swap
* y+ q6 @' l  Q, U- fSetting up swapspace version 1, size = 1023996 KiB- _# w) D- d- e7 W
no label, UUID=2fb7fd7c-d5aa-451b-9766-5acb72dd6990
8 j4 u  I* R4 d# I& q- d
. x# M" ?3 A( F: j; {
/ \0 g0 y2 l1 z' }3、再用swapon命令把这个文件分区挂载swap分区
6 @- g+ j; e( i: ]6 S' U2 u# swapon /swap3 W1 q+ `& n# s6 J5 L
swapon: /swap: insecure permissions 0644, 0600 suggested.
6 R# a  }3 z' E. ^
! g1 _4 o! x1 `" C6 }; [" E3 d9 Y0 R  T& [5 }& i  j& h# @

- {4 }" o" C. E5 \! _1 k/ [9 z4、为防止重启后swap分区变成0,要修改/etc/fstab文件% h3 n/ n3 A5 I& R1 u2 `" ]/ D1 Q
vim /etc/fstab
8 k/ o2 G, A1 c& Z% k6 k$ A6 X在文件末尾(最后一行)加上:+ f( A' F; d* |3 ^$ D
/swap swap swap default 0 0% p2 `8 ?: B& C: d2 J3 Y! L

9 n# r& I# v. o/ a$ p9 d% r4 omount -a
6 O. u9 z& C  l  t$ I. t+ Q7 j6 O, _% P1 H9 n
扩容swap 分区:0 [! u/ s7 L8 G! D2 H
[root@kvmvm ~]# swapoff /swap
" g9 g. p0 d. O/ n
5 X7 m% m  F$ A$ h7 X. j# dd if=/dev/zero of=/swap bs=1024 count=1048000& T0 I: `4 [' p
1048000+0 records in
9 {6 F1 o" r! @1048000+0 records out0 k! \+ O, ?+ G3 M& [& F
1073152000 bytes (1.1 GB) copied, 12.6694 s, 84.7 MB/s
6 ]% O  e1 i4 s1 d  N( _' `5 ~; s
( ^/ J+ u9 {0 r" g5 I& @# dd if=/dev/zero of=/swap bs=1024 count=2055000
3 a- S2 f& e. \# e, J# Q0 H  N
1 g* W8 Q! t( Q. I5 q( z#  mkswap /swap# ]& T5 {! ?* H/ o' H
Setting up swapspace version 1, size = 2054996 KiB! L9 h( h& V3 K7 S& }
no label, UUID=8dd77b7a-744a-452d-b991-5b2e01702464, L3 B: A5 w: ^( Q) R( K
1 u$ F) [) V9 T* ^& n/ P& z7 i( ^
9 Q9 m" J0 a- a- [' X  w) f
# swapon  /swap) R1 q( A$ T4 X* `$ @
swapon: /swap: insecure permissions 0644, 0600 suggested.1 E9 ]0 l' R& D  E
swapon: /swap: read swap header failed: Invalid argument
& d/ U% u2 B; }- w- M6 p+ q# E9 f0 c5 @" S6 D" u! b) t- l# G
# mount -a; y7 s6 k0 c+ h5 q& N: R& J6 |  F
0 w, w+ u- {7 X
              total        used        free      shared  buff/cache   available
3 R; a: _% ^1 n3 nMem:             31           1          27           0           2          29( K; j, F. A- L  F8 t
Swap:             1           0           1
4 @5 B, M6 w8 c! F3 Z9 z( ~+ p free -m! O% {( N9 _, M7 b9 N9 }7 g1 k  s% v1 J
              total        used        free      shared  buff/cache   available
0 k* f+ B+ K& P! k, HMem:          32011        1037       28171           8        2802       30595
0 E6 e. ^9 u7 ]( `Swap:          2006           0        2006
+ [! W6 p6 k" S; M% i% T! u

/ O8 ^+ B1 J, B可参考这个值:- g7 z1 O- D4 T, ^
' k2 @5 x  ~9 M0 K7 n1 ^# q2 v
https://www.bbs168x.cn/forum.php ... &highlight=swap
; l" @& S8 J0 v, F1 ]& P" R
6 Q4 x8 _# h0 V0 g
% m9 B1 \! I: w, H8 o6 P8 k( q7 w+ U3 p8 [! A* R
! K! J4 E7 J" r

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
/ F' q  Q4 h  y6 P8 [6 C. x0 w( C5 Mvm.swappiness = 10' o3 }' N# {6 P! g) s* D

$ N% x! p) i9 l; s[root@jenkins-01 ~]# free -m
0 X8 r5 Z9 S5 f              total        used        free      shared  buff/cache   available2 |4 H: m: }6 g- y- L9 H
Mem:          15880        5080        7093          27        3706       104417 U/ V$ V5 a& L  H
Swap:          2047        1952          95( J9 |) q) q8 A6 h; w6 Y$ k
0 w, Z+ g5 P4 j
设置了感觉没有什么效果。

70

主题

73

回帖

1201

积分

网站编辑

积分
1201
发表于 2025-2-27 10:54:33 | 显示全部楼层
(3)操作释放步骤
. T0 f4 d( ?' T(a)swapon -s查询挂载的分区,记住这个名字name,比如名称叫/dev/dm-1
4 b/ |- D/ i- W. z1 ?- l  Q7 e1 b' O$ t. k5 \: r) v  Y* T

* a7 ]3 g$ m) \* H9 c3 o(b)关停这个swap:swapoff /dev/dm-1; ?& W0 w  n7 k6 O9 v6 K9 y
(c)需要等待关停结束,需要等待比较长一段时间,可以通过free -m查看什么时候swap值为0即为关停完毕
4 X* A5 R- i9 p9 X9 `  E(d)也可以用swapon -s看下是否关停完成' {5 a  e+ G( C* Z
(e)重新挂载:swapon /dev/dm-1
; |- ~2 }$ ]% I8 a# Z(f)通过free -m可以看见挂载完成,swap占用内存释放完毕
8 K% i- }$ N/ W

70

主题

73

回帖

1201

积分

网站编辑

积分
1201
发表于 2025-2-27 10:55:37 | 显示全部楼层
# swapon --help 1 }4 _9 [9 I/ Q# [! F
4 L! D9 s6 v/ _0 ^+ i1 g
Usage:
! l4 s$ p& i7 i: O  G/ p5 u swapon [options] [<spec>]
8 L5 W0 w9 G( e, h) {' `
% F- c  k3 _$ G8 oOptions:
6 H) V9 [6 H2 t -a, --all                enable all swaps from /etc/fstab
, K% ?. j, F0 P7 ~$ \; t- I, v -d, --discard[=<policy>] enable swap discards, if supported by device! \4 B  L# I9 @1 {1 c, H
-e, --ifexists           silently skip devices that do not exist
' @9 F/ a8 O4 n -f, --fixpgsz            reinitialize the swap space if necessary% }. W$ `7 i1 A* ^. K& l2 r
-p, --priority <prio>    specify the priority of the swap device) P6 p* v( s/ W  |6 o
-s, --summary            display summary about used swap devices
8 J9 X7 m* h: }+ w& _     --show[=<columns>]   display summary in definable table
; ]. W5 A/ I9 }. r2 Q     --noheadings         don't print headings, use with --show
9 i- R+ b# y9 O5 j& r     --raw                use the raw output format, use with --show) h+ q+ r0 v& |' D( o  `
     --bytes              display swap size in bytes in --show output" [' j$ c. t* R" r3 A0 @7 E
-v, --verbose            verbose mode) Q7 J' T) D  W8 {
5 J% K* Z' [( @6 H7 V8 J1 S
-h, --help     display this help and exit0 Y) G. B- Z; {- i* s
-V, --version  output version information and exit
: T0 @- x& s9 h8 U3 g$ l/ f) d. x; C1 T3 ?3 |
The <spec> parameter:
" j1 @  {  Z. G -L <label>             synonym for LABEL=<label>
! l, V; _5 W% C6 j0 A/ }! G  u -U <uuid>              synonym for UUID=<uuid>3 u; \! T5 c0 [; s0 N
LABEL=<label>          specifies device by swap area label
3 b, Q; i  ~- S) i4 Z UUID=<uuid>            specifies device by swap area UUID( _+ ^# U, |) o$ D1 U; k
PARTLABEL=<label>      specifies device by partition label0 H. X3 f% F3 `4 I
PARTUUID=<uuid>        specifies device by partition UUID
) B: F! d( j+ O& C <device>               name of device to be used
, T0 T8 h$ S1 K, w( L <file>                 name of file to be used  n; y' K5 z0 X- o4 C0 |: W0 V0 l
* Z5 i) g- p6 Z2 B8 V" S9 ~
Available discard policy types (for --discard):
/ ?( }9 [0 l6 ^" U once     : only single-time area discards are issued. (swapon)7 d9 ?& k: f5 {* M3 u' z
pages    : discard freed pages before they are reused.. }$ K/ j9 T4 Y9 a/ g
* if no policy is selected both discard types are enabled. (default)  z6 y2 P4 L3 D  [0 d" A

: L& F" N" ^  O7 t* LAvailable columns (for --show):% E% s# T; u8 @/ H  M
NAME  device file or partition path8 C/ P* J" U6 Q- @: x6 c
TYPE  type of the device, c" \2 M2 j- `$ p% A  \" c
SIZE  size of the swap area
) B- s1 c1 Y+ {( ? USED  bytes in use; S. c- j! U$ s3 X* d
PRIO  swap priority0 J6 B7 u; U5 R$ ~& ?, c4 Q1 a7 `$ C

# F  I" b& Z% X$ x' y+ OFor 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=102 ]# M: u* h3 S2 W# e' H# W: E8 C- |- c, \
cat /proc/sys/vm/swappiness
0 @4 b# F+ Q- N. h3 g! k这个设置了,不生效。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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