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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2025-2-27 10:23:41 | 显示全部楼层 |阅读模式
遇到swap分区使用过高的处理过程" J' ?* n/ K9 ]  C3 s# D
[root@devops-prod-jenkins-01 ~]# free -m
; Z' Q( a7 K# n5 t0 g; \# a$ x              total        used        free      shared  buff/cache   available
) H5 V* x* x' P, e: Q9 JMem:          15880        6479        3147          36        6254        9034  o& Z. c" @/ S0 A/ L
Swap:          2047        2034          13
. U/ l5 g; E% V/ o8 p8 z9 u0 U2 L; B
, j6 X) k" b' `6 G

8 b, h5 |  g* d1 u: K观察 /proc/zoneinfo 中这几个指标的变化) b3 S  t* D4 X, y) I
watch -d grep -A 15 'Normal' /proc/zoneinfo # L4 p$ _. R3 H

  z. H, z" E! q% e" M; `! hEvery 2.0s: grep -A 15 Normal /proc/zoneinfo                                                                                                                                                   Thu Feb 27 10:09:19 2025) j' m' h" M* _5 s4 O

7 ]1 G4 @; ?3 K9 C: wNode 0, zone   Normal
' z; W$ ^, S2 N  M, i  pages free     120551: f( I( W3 X1 Z
        min      138677 v- k  {2 ]2 o+ [& b
        low      173335 K2 c6 j1 t4 j+ u. r+ f. w
        high     20800
9 K! _! n8 z! w' M& H        scanned  06 h2 ^6 y2 x: J" h! H
        spanned  3407872) g) }0 u3 c/ b- Z" A5 o+ h3 U
        present  3407872' t0 ?! Q+ i/ \& a. m
        managed  33367972 _- c9 y1 l* n. \
    nr_free_pages 120551
& Q5 ]) X  Q% z& g* U' t( I    nr_alloc_batch 828
8 r: O' {6 B& Y; M  r6 @    nr_inactive_anon 315091
7 Q8 E) h' l+ {    nr_active_anon 14858635 z; b- j0 @5 ]+ M  c. Q" D
    nr_inactive_file 442039
3 G5 o' U, P+ ^2 u) j    nr_active_file 5073316 K5 N: `4 U& w0 j
    nr_unevictable 0. o0 C$ [  K* ?" o1 n4 s( J% m
' ]1 {0 n( s* X: C. Q
剩余内存(pages_free)在一个小范围内不停地波动。当它小于页低阈值(pages_low) 时,又会突然增大到一个大于页高阈值(pages_high)的值。
# K2 V3 u5 @% b
. e  Q- P5 t8 r1 D& @  p再结合刚刚用 sar 看到的剩余内存和缓冲区的变化情况,我们可以推导出,剩余内存和缓冲区的波动变化,正是由于内存回收和缓存再次分配的循环往复。
# b( E, r# M: n  v4 g6 R( p- |! v8 l" u7 W3 d9 m, ~
当剩余内存小于页低阈值时,系统会回收一些缓存和匿名内存,使剩余内存增大。其中,缓存的回收导致sar中的缓冲区减小,而匿名内存的回收导致了Swap的使用增大。' w8 a. m9 q7 U1 S; l0 S8 W4 i

' z. G0 `9 b0 P' ^+ L7 Y. X( U# i紧接着,由于dd还在继续,剩余内存又会重新分配给缓存,导致剩余内存减少,缓冲区增大。
& B0 s+ Y5 G; ^) J7 b# W! V5 V
其实还有一个有趣的现象,如果多次运行dd和sar,你可能会发现,在多次的循环重复中,有时候是Swap用得比较多,有时候Swap很少,反而缓冲区的波动更大。
% f' {/ w7 @6 a* e+ q2 }$ u7 M- _3 w" m3 b* `# E
换句话说,系统回收内存时,有时候会回收更多的文件页,有时候又回收了更多的匿名页。
1 `! Z- S, X, g! O3 {
1 ]7 j5 U: j( J$ z2 D显然,系统回收不同类型内存的倾向,似乎不那么明显。你应该想到了上节课提到的swappiness,正是调整不同类型内存回收的配置选项。
  h, N* z, x- `' K, `: x9 r8 x' B* M1 [1 A$ ?2 J! }
查看swappiness的配置
- a% Q4 v: p" o7 b# ?! ?# cat /proc/sys/vm/swappiness
$ N, i7 H1 [3 C- O6 K" a! l7 F6 w0 {$ c' a
60) ~! q7 j, d6 x# r) z; u6 l
swappiness显示的是默认值60,这是一个相对中和的配置,所以系统会根据实际运行情况,选择合适的回收类型,比如回收不活跃的匿名页,或者不活跃的文件页。
1 W' |4 u8 L3 y9 v6 \, ]* U
8 Z. y7 W, t2 e) A

* O$ s& A7 ^3 U5 r: C' {到这里,我们已经找出了Swap发生的根源。另一个问题就是,刚才的Swap到底影响了哪些应用程序呢?换句话说,Swap换出的是哪些进程的内存?1 W9 \! y  }" i! a
: ^3 R) ?4 P7 q4 M! }5 D+ ]

5 e' u$ I! o, x; R) W这里我还是推荐 proc文件系统,用来查看进程Swap换出的虚拟内存大小,它保存在 /proc/pid/status中的VmSwap中(推荐你执行man proc来查询其他字段的含义)。
# L+ Y$ Q8 N, O* k
8 |# g! a" d3 Y
) _; t1 g9 k* A3 [' Z
在第二个终端中运行下面的命令,就可以查看使用Swap最多的进程。注意for、awk、sort都是最常用的Linux命令,如果你还不熟悉,可以用man来查询它们的手册,或上网搜索教程来学习。: q. g! p0 C5 J! h
. z& [* H2 X- v% U/ B$ ~
for file in /proc/*/status ; do awk '/VmSwap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 3 -n -r | head
& Q+ |' \% W/ F! {- Zdockerd 2226 10728 kB* x0 t+ _. ]: k/ l
docker-containe 2251 8516 kB1 V3 H& T- o& {& D8 o: u+ }
snapd 936 4020 kB* R, H* q) A! p# k7 t) r9 P: B# t
networkd-dispat 911 836 kB4 o2 c9 B4 w: x2 g1 n/ l( E! [$ t4 `
polkitd 1004 44 kB
" n( b, x& Z9 s' e- Q$ ]. C2 l1 h+ f$ d' Z' k  W

' p+ Y! e# X9 Z. E" W* Q/ P+ o) t) v8 h( u) g  G" y

: Z2 P6 U  S2 M, D* w0 G也就是说,你的内存在使用到100-60=40%的时候,就开始出现有交换分区的使用。大家知道,内存的速度会比磁盘快很多,这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。2 o3 I* y7 m7 O* K$ Q8 o
& v  }- E& y* n; Y
临时调整的方法如下,我们调成10:
9 C" D! y9 s/ Q! ]- x  e* y) M- L" i  I/ N+ ~2 L
sysctl vm.swappiness=10
2 X) I- i7 ~: R/ |cat /proc/sys/vm/swappiness, Y: k- Y. |$ Y& Y
10
9 i# W( `6 ?# T" O' e- O, u
* T3 G4 W2 b: }% S: ?5 @这只是临时调整的方法,重启后会回到默认设置的
$ H2 ~7 p3 u. [( o( y  x% _* C9 ?/ |
要想永久调整的话,需要将在/etc/sysctl.conf修改,加上:
- z( Y  o% W; g$ z8 v. D6 k: Q- M# w! G2 h* q) C6 Q5 Y) c, y  J% C: X
cat /etc/sysctl.conf
/ }! G6 }: G! B, |+ |) svm.swappiness=10
1 ]3 h* s! p7 M. G' [" \/ J$ ]& k! `; `" E, h- T3 y# a
' w) w1 h% N! F9 d( `0 L: o3 ~/ k+ [! O
解决方法:
' p( n8 z; S6 S7 r( y: [1、调整swappinness参数
5 }; K' P- \1 t( Z3 N/ @+ c
# r! R: y6 J, g9 q& s# w, _% F* E3 U% I临时调整
7 q+ O# R& c6 Q  q) a# sysctl vm.swappiness=307 M3 U- e1 Y: H# |4 g  X# v! w
vm.swappiness = 30
+ V0 `2 V3 ~  K! w. H; n: Y2 h1 {2 X! Q0 M# W) [
# cat /proc/sys/vm/swappiness 1 }4 K# i, ^( x0 J6 ~: V. d# I
30' j. X& n- @! s- x6 c2 ]! U
9 D9 D9 ~4 p- p% k+ F
永久调整:
; D( g8 A) r* Y# u6 G8 \设置
( [1 f: F& C2 A' M* Z修改文件/etc/sysctl.conf文件( c, s# _6 P3 y: ]0 F! G4 Y. _
vm.swappiness = 30* I/ f. R9 p4 y0 E) ^7 z
生效
* T) a/ M2 b; G; }, {2 E' }sysctl -p3 q* ]1 w3 b, a2 z. @8 Y

! y0 h* k* J6 p3 U, P2、调整swap空间
( L7 [6 H# j4 g- A4 l: }8 t6 E% D* E1 q
使用dd 创建swap分区
& F/ n8 g' `; X: a6 M6 [dd命令创建sawp文件:
! ?0 B+ J5 P! J' Y# dd if=/dev/zero of=/swap bs=1024 count=1024000/ ?/ b4 h+ u* z8 F
1024000+0 records in1 g$ S0 a8 [$ a6 C
1024000+0 records out+ t# z* X# L8 @% ^3 o- C$ P$ a
1048576000 bytes (1.0 GB) copied, 2.14338 s, 489 MB/s" O. A1 f1 i& H/ E! J1 j1 n
#. B! d6 s7 }' F! \6 \& o( l
' E3 Y/ ~0 |4 A: M9 @
制作为swap格式文件:
4 l  U" ~' I6 U8 q" `& O
0 w+ O5 p( ^5 y# mkswap /swap6 A% J' s3 ]( q( c% d" U- L7 z& u
Setting up swapspace version 1, size = 1023996 KiB
* N! `' U' l7 g" b1 Yno label, UUID=2fb7fd7c-d5aa-451b-9766-5acb72dd6990( D$ F# D' u7 [% o# ]3 F0 O
/ \% v9 C9 z8 r' S4 V4 m: ~  I

; A+ _$ k# b3 B' K1 X8 y4 v3、再用swapon命令把这个文件分区挂载swap分区% k- X; Z' R% c" z( @# |
# swapon /swap, L8 C9 B9 \' C$ ]1 N& y9 L
swapon: /swap: insecure permissions 0644, 0600 suggested.
* e/ [1 _+ \3 S/ T  U6 z- `; o1 f* I
3 D8 l( f  i2 h7 E5 @3 ]. j: t; \, @5 r; N* j4 I8 {

2 @4 k- ^. f' k4、为防止重启后swap分区变成0,要修改/etc/fstab文件
) u; |* A8 p: j0 X3 a8 Pvim /etc/fstab' P  t! r, L) e' U$ r, x/ M$ x, I
在文件末尾(最后一行)加上:
! M2 D2 ]/ E$ }$ ]! b7 G  Q2 q/ X" y4 H/swap swap swap default 0 04 R2 Q* y' G4 ^- d) j/ q7 P

( t7 R! X+ M; ]8 o$ e5 X& zmount -a1 w" V3 C& B+ T

+ A1 o6 I2 e+ r' c) @扩容swap 分区:
8 D; x) q4 G9 m& b: g[root@kvmvm ~]# swapoff /swap. a) X' B2 [, U8 C5 o
" C0 ]  T% K3 s% r  B( x
# dd if=/dev/zero of=/swap bs=1024 count=1048000
/ A9 N% Z" P) _! W8 L( |: B2 Q1048000+0 records in
! @( W3 }9 j3 M+ X8 z1048000+0 records out$ v6 y# e1 C1 G/ r0 y0 I, _; \
1073152000 bytes (1.1 GB) copied, 12.6694 s, 84.7 MB/s
* A, f* t9 S4 U& r/ l
. w+ Y  ]7 `0 x8 G, n( B  @5 G0 G; b# dd if=/dev/zero of=/swap bs=1024 count=20550006 ]& l9 s5 l' Y$ |# S
5 c1 J3 \( i- T/ `0 D) ]
#  mkswap /swap* p* i+ O$ |  T% T; g$ G# E
Setting up swapspace version 1, size = 2054996 KiB6 [8 N( f& j/ y+ j
no label, UUID=8dd77b7a-744a-452d-b991-5b2e01702464
# Y7 q5 k; D% d! X# c6 X% M& a1 k$ l& R) w' F9 F# v9 J7 @

, K6 c/ N4 C+ y5 S: ]* m/ m2 |7 z0 a# swapon  /swap" Q, n  o" [9 z) F
swapon: /swap: insecure permissions 0644, 0600 suggested.3 b7 o. I) J0 a2 J' ]2 S3 j1 J
swapon: /swap: read swap header failed: Invalid argument
& O4 Z' [' C/ v( Z2 ^
+ B% o* F" z/ @* c7 G# mount -a* G( m4 U8 C& A2 }1 ?! a" U9 ^  O
& O5 V9 d5 U7 t0 a" {* N% Y
              total        used        free      shared  buff/cache   available
- L- T* S2 s) UMem:             31           1          27           0           2          29( O7 Q$ }, G/ J" X, u  E
Swap:             1           0           1
5 w2 Z' }, c5 ]/ A8 B4 Y free -m) w5 d. ?# G( w0 y% `* o
              total        used        free      shared  buff/cache   available
7 m8 d! L3 i7 r9 ~9 z" pMem:          32011        1037       28171           8        2802       305958 x5 }0 o7 U& M. q2 C
Swap:          2006           0        2006+ C# z  B" {$ F' z0 M5 X

0 O$ q. E' c2 \3 n* Q# M可参考这个值:+ O8 @6 r! N" `# @  k: |
3 x. s1 H' p+ P
https://www.bbs168x.cn/forum.php ... &highlight=swap
( T  \- J0 o4 `! |/ c8 ?( ]6 y7 X/ e2 k: Y: O+ R3 o$ m) s

/ N4 k. e& j6 G% V0 y
2 g+ v9 \* s0 g7 b/ [# ?0 [3 f7 f9 V: M) X. k- U

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. z" N( z3 I3 C: j' E6 M( d. o3 p
vm.swappiness = 10
5 f9 [: ~5 R+ F/ C1 V# C2 G
6 L- ~( l$ x: l; w" h  G$ N9 k[root@jenkins-01 ~]# free -m # I  H7 `8 k: r* y2 _  u
              total        used        free      shared  buff/cache   available
& F& C+ S  u4 X3 |5 OMem:          15880        5080        7093          27        3706       10441! `! k0 z0 b( E7 `# r. Q
Swap:          2047        1952          95
  \8 T# q5 x# _! y
% @* W  x+ @3 D2 W/ |  e设置了感觉没有什么效果。

70

主题

73

回帖

1201

积分

网站编辑

积分
1201
发表于 2025-2-27 10:54:33 | 显示全部楼层
(3)操作释放步骤' G* {- X& C! q2 k% F. Q
(a)swapon -s查询挂载的分区,记住这个名字name,比如名称叫/dev/dm-1
$ M# R% x/ w! C: u  V, ^6 A/ Z- z. E* G) b9 @( O& m

' ?( V$ d5 E$ q7 j- K(b)关停这个swap:swapoff /dev/dm-1
2 Q+ X$ L* ]# Q# e(c)需要等待关停结束,需要等待比较长一段时间,可以通过free -m查看什么时候swap值为0即为关停完毕
- i- [' |0 Z' \& M+ {0 f: t/ T(d)也可以用swapon -s看下是否关停完成8 H: w4 \2 Q& o2 p2 i9 X9 @6 p
(e)重新挂载:swapon /dev/dm-1; ^3 x  n% N3 }, p0 W5 J' l4 T
(f)通过free -m可以看见挂载完成,swap占用内存释放完毕- g5 V( Y$ a: a2 ]. J9 i* x

70

主题

73

回帖

1201

积分

网站编辑

积分
1201
发表于 2025-2-27 10:55:37 | 显示全部楼层
# swapon --help
/ B4 H9 R: }) @' Y+ e$ p8 `5 H
- A  j0 F5 R3 m! }6 R# ~Usage:
) Y5 `( T5 V; I swapon [options] [<spec>]0 V6 `- m4 t/ s2 a$ h6 E
- c) A; k8 q( ~( \
Options:
; `0 r% y/ Y; M& X -a, --all                enable all swaps from /etc/fstab
: D# Z! z* ?4 }7 v -d, --discard[=<policy>] enable swap discards, if supported by device
0 v9 V8 Z7 W7 c3 Q, x4 @- ^ -e, --ifexists           silently skip devices that do not exist  m4 A# _: `9 M2 e
-f, --fixpgsz            reinitialize the swap space if necessary* H& j. J& G2 s0 R, u  T8 P- x
-p, --priority <prio>    specify the priority of the swap device' b7 ]  s" R0 D: Y2 S
-s, --summary            display summary about used swap devices
% S7 b6 |2 i5 I# u     --show[=<columns>]   display summary in definable table$ q1 Q# r, H: J8 O% x7 m
     --noheadings         don't print headings, use with --show
- M" Y- _' u' m, v2 Q     --raw                use the raw output format, use with --show
$ d. |( a) @% E) {' @! {     --bytes              display swap size in bytes in --show output, k+ y  \4 P0 b# C' p' D
-v, --verbose            verbose mode
9 q. }( \. e& X8 V! ~  r6 E9 z; c9 P  T+ C3 v
-h, --help     display this help and exit
4 D( e7 }0 n4 T1 ^3 ? -V, --version  output version information and exit
% G* D* Q& X5 u# \/ ^( H, n
9 ?, B& _4 N( y) Y. q1 C; sThe <spec> parameter:" D2 q5 \# Q; G
-L <label>             synonym for LABEL=<label>
+ Y3 ]3 a7 v! ?, S/ a! Q% V7 ]7 s -U <uuid>              synonym for UUID=<uuid>
6 M( k) j9 M  K0 R, V0 E( C LABEL=<label>          specifies device by swap area label
' K) M5 i' Y: v2 @0 k UUID=<uuid>            specifies device by swap area UUID1 B" a4 h3 g# V' q- E
PARTLABEL=<label>      specifies device by partition label# M! ]3 Q  T% j6 E
PARTUUID=<uuid>        specifies device by partition UUID
0 c* a8 m3 d0 q <device>               name of device to be used; T4 c* [6 b5 W! \
<file>                 name of file to be used
( O6 _& D- |3 a- K0 E2 P$ y" Y
2 E; j- R- f' S/ kAvailable discard policy types (for --discard):; J) B; V( V% I+ y2 }) y# O0 y! @
once     : only single-time area discards are issued. (swapon): O3 B! d  T0 j% M! X3 w9 d
pages    : discard freed pages before they are reused.
7 p9 ]. q- `* L; u * if no policy is selected both discard types are enabled. (default)
6 Z" \. {+ G0 n- ^- r% q6 X, x* p! u6 f2 A3 d
Available columns (for --show):
# r! f2 F% ~6 g, @1 Z NAME  device file or partition path
$ o6 y0 a# S. }( m4 r TYPE  type of the device
. @# z! [' n) z  p( t# f! i# @$ q" S SIZE  size of the swap area% p' x: o- A6 K" @' N# @4 n# Z
USED  bytes in use
$ Y: j1 _  S  F3 z6 G2 j. [ PRIO  swap priority3 O3 X4 z# _+ @0 A

4 L/ o+ x1 `4 j" N0 [. X/ wFor 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
% ~1 b8 Q& k/ {" ~* ?& bcat /proc/sys/vm/swappiness
( n3 @2 n5 P  N/ @. B这个设置了,不生效。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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