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