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