|
|
遇到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
|
|