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