- 积分
- 16841
在线时间 小时
最后登录1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
遇到swap分区使用过高的处理过程+ L3 E" U3 c" m; Z
[root@devops-prod-jenkins-01 ~]# free -m
# _; `2 \4 ]; b! C w( g total used free shared buff/cache available
T! H9 F* p! Y. ]0 @7 x f+ Q0 jMem: 15880 6479 3147 36 6254 90340 K( D, Z! o7 m
Swap: 2047 2034 13. S( }: [/ O* \ o, X
0 ?% `) `5 T6 @/ p/ _8 E$ j# f
; }5 L$ {& h: T! z* v
4 I- K( X, x, \8 {观察 /proc/zoneinfo 中这几个指标的变化
0 ~9 O9 `0 u( P& ~6 y- Qwatch -d grep -A 15 'Normal' /proc/zoneinfo
* N" k3 {: U& [ a1 B$ V9 H8 m. O& g, B% f! g
Every 2.0s: grep -A 15 Normal /proc/zoneinfo Thu Feb 27 10:09:19 2025
( n' |. q* I( j: a9 P+ p+ I* k c4 [
Node 0, zone Normal% T% O1 B* x! d+ ]
pages free 120551
+ M1 O7 b. b, ^' w5 t' l min 138670 }& ~+ X# K' t* Z
low 173330 y7 X; w" I Q7 ^/ [0 ^
high 20800
# B& J; r; d+ n1 {6 ]3 X scanned 05 q" a; v# J; g8 v" {8 v
spanned 3407872, l" a" ^6 S+ M% } F
present 3407872
4 V5 T4 E) a8 l/ i( |9 p managed 3336797
5 C* z0 w$ v9 G/ | nr_free_pages 120551
: o$ D: J) ]- B' F3 T3 {& R5 B nr_alloc_batch 828
4 _1 W8 G8 B* v5 I9 X; u4 T nr_inactive_anon 315091' K9 f% U& T7 s1 j3 P8 ~
nr_active_anon 1485863
' S4 D/ `( S- g0 D9 T4 F4 H) V% |( M nr_inactive_file 442039
% o$ N2 o1 r& i6 x nr_active_file 507331
7 c* Q& O! W' j0 h& s nr_unevictable 0
0 y/ Q" ?! R% l. B- ^6 ]7 _$ g; D U" }
剩余内存(pages_free)在一个小范围内不停地波动。当它小于页低阈值(pages_low) 时,又会突然增大到一个大于页高阈值(pages_high)的值。
- C) _; j$ d, `; _0 G: r U
/ I7 b3 h! O6 ^2 y* k再结合刚刚用 sar 看到的剩余内存和缓冲区的变化情况,我们可以推导出,剩余内存和缓冲区的波动变化,正是由于内存回收和缓存再次分配的循环往复。% G9 T6 T' M; i2 R% |2 N7 P. R
* N3 e! p* y0 f
当剩余内存小于页低阈值时,系统会回收一些缓存和匿名内存,使剩余内存增大。其中,缓存的回收导致sar中的缓冲区减小,而匿名内存的回收导致了Swap的使用增大。* S! p4 k1 F. c; F% x8 P2 d2 ^: v
+ a: T" i/ f- m b) b# o
紧接着,由于dd还在继续,剩余内存又会重新分配给缓存,导致剩余内存减少,缓冲区增大。+ x4 s! K1 H/ o
. D2 M0 A U/ Z& I$ }* S. m) J$ A1 e
其实还有一个有趣的现象,如果多次运行dd和sar,你可能会发现,在多次的循环重复中,有时候是Swap用得比较多,有时候Swap很少,反而缓冲区的波动更大。
2 P# x$ A' ]7 H. W/ Q' r; f$ G& K6 e
换句话说,系统回收内存时,有时候会回收更多的文件页,有时候又回收了更多的匿名页。8 h3 q, C* V% H/ m8 I+ Y( t
, y0 ?$ h% M2 Z0 m8 j! H3 ]. l显然,系统回收不同类型内存的倾向,似乎不那么明显。你应该想到了上节课提到的swappiness,正是调整不同类型内存回收的配置选项。
4 H. m2 ?3 b$ p7 _, T: r1 I$ D7 H+ d9 c: i6 Z8 A
查看swappiness的配置
+ `+ V* G' ?4 @& Q2 H: K# cat /proc/sys/vm/swappiness 4 B" J2 q" O$ q' f! P0 I
. g+ a8 P* m: o6 i7 x4 S' D/ W60
: G% Q* |# I* o6 p/ uswappiness显示的是默认值60,这是一个相对中和的配置,所以系统会根据实际运行情况,选择合适的回收类型,比如回收不活跃的匿名页,或者不活跃的文件页。
* _- D; e |3 r4 a; {) H" }" `
% U9 L' d+ v' K! C( I. L- e% o$ L$ j
到这里,我们已经找出了Swap发生的根源。另一个问题就是,刚才的Swap到底影响了哪些应用程序呢?换句话说,Swap换出的是哪些进程的内存?
& O/ z8 Z3 e, y: F; t- ]# C$ p$ p& `( \2 V. u- f
9 F d; @# w% t' Y1 J/ K! g$ j4 S& g这里我还是推荐 proc文件系统,用来查看进程Swap换出的虚拟内存大小,它保存在 /proc/pid/status中的VmSwap中(推荐你执行man proc来查询其他字段的含义)。8 Q G1 z9 M# J: c3 P( B
* T9 C0 u6 }* O! d
9 m- a7 P3 J; |6 Y在第二个终端中运行下面的命令,就可以查看使用Swap最多的进程。注意for、awk、sort都是最常用的Linux命令,如果你还不熟悉,可以用man来查询它们的手册,或上网搜索教程来学习。
" q2 H1 r( X* u. e0 P1 ]! \6 B& J! \+ [
for file in /proc/*/status ; do awk '/VmSwap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 3 -n -r | head2 Z7 R0 a- v9 L9 k) V
dockerd 2226 10728 kB
' x) L" |# }( S1 C! t% E, f9 Ddocker-containe 2251 8516 kB# | D) k* L, t- a$ |
snapd 936 4020 kB
- u* P8 M* V! Y1 N% j6 }6 S* i5 Fnetworkd-dispat 911 836 kB, }$ K" i1 K4 y; J8 c
polkitd 1004 44 kB
4 Y* a3 Z4 N, O4 @/ N/ ^% O- q
7 l0 g# f0 ?" e* Z% G5 J k' q, B5 u9 j6 c) w
" W8 t8 a6 p$ r9 ^7 X- R
. ?3 ^7 v! P% g% B+ W也就是说,你的内存在使用到100-60=40%的时候,就开始出现有交换分区的使用。大家知道,内存的速度会比磁盘快很多,这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。$ K& L( O I& \+ f& V
" ?7 A0 G9 y. d: ~临时调整的方法如下,我们调成10:
2 f" m) @) f8 h4 Y: f2 R/ z, U5 B
9 y. n1 X$ g, d% Psysctl vm.swappiness=10- O. n; q( ?; w, R
cat /proc/sys/vm/swappiness
8 E) R: G4 J# `% b10
8 C( M5 E5 v0 L2 f) P# p7 W1 o2 ~* L7 z+ ^1 d+ \2 i) x
这只是临时调整的方法,重启后会回到默认设置的
0 h% N2 {2 x9 y7 O) @; D: i7 x# ?4 ^& e) T* R
要想永久调整的话,需要将在/etc/sysctl.conf修改,加上:' |6 W$ n- m( R, V
; ]9 N1 Z2 N4 m5 A. W) \cat /etc/sysctl.conf
4 u1 M6 i, N) H' p* i, dvm.swappiness=10* f2 i0 T. q7 G1 W) |! Y& Z
+ H9 a; m& [4 A. R, c
$ y) W% G& w/ W+ \ k
解决方法:, a$ F' A7 w; v! b9 O
1、调整swappinness参数
7 h- m9 o# G' D5 t, q' f( H b8 T: k6 c6 N1 m9 |: I- S
临时调整0 o0 D, S+ b. D1 X
# sysctl vm.swappiness=308 q9 S) C! d1 m% c4 G" K7 T
vm.swappiness = 30
8 b f3 C' G( K2 M; o2 c4 j
1 U: f* s* w" }. Z# cat /proc/sys/vm/swappiness
* J- g- b# L! x6 q+ |; H) s30
. ^0 g$ o$ `7 V1 m2 @ D- I# _3 l/ s4 S0 c; a
永久调整:
& J5 R$ ?" r* y ^0 s% G: p8 W设置
( z* a4 R n8 b. e6 N& X- z修改文件/etc/sysctl.conf文件
) {% H1 ~2 E& Tvm.swappiness = 304 \# X) m4 T' O6 J3 J! C
生效3 k: D) p; |8 D( N# C2 }- G( f; y
sysctl -p; H- _4 l: t, f+ T9 w! X5 o
1 E; n3 i" \' r1 [( ]3 f# b2、调整swap空间8 [* I2 p" u/ n9 @& B
4 Y7 J4 P1 g" t使用dd 创建swap分区5 z1 W) f' l& g0 S
dd命令创建sawp文件:% @$ M' ~. G% l9 W% L- ~
# dd if=/dev/zero of=/swap bs=1024 count=1024000. U8 p# H# s' e8 g. y5 k. M$ a
1024000+0 records in
& `. z& r) w' A1024000+0 records out. S) t" l9 g8 v3 o" a
1048576000 bytes (1.0 GB) copied, 2.14338 s, 489 MB/s
% p: q J+ u) U+ `' p## g# g+ k- f5 s4 b8 v G
& Q' l) ?6 h8 V$ W2 P1 G* ?
制作为swap格式文件:
! D8 n- W+ Q' x6 \$ L1 A1 _8 _7 t6 c2 K/ b7 x/ u f
# mkswap /swap* L6 T5 R: s: r2 Y; V
Setting up swapspace version 1, size = 1023996 KiB; J: d# C7 u4 i" c
no label, UUID=2fb7fd7c-d5aa-451b-9766-5acb72dd6990! V& L. P$ L& S* k5 a' ^
0 Y* A* {! U* L3 o; u6 E- a
1 d, A3 L) S5 B7 g) r" a: y% y3、再用swapon命令把这个文件分区挂载swap分区
" C- ~8 C, C/ r: Z# swapon /swap+ U/ s9 w9 Y, Q+ k t
swapon: /swap: insecure permissions 0644, 0600 suggested.
0 l# F2 W( |( h+ F! e" ^1 [
8 s4 |, G/ V' z, a Q. [# U
1 t# |1 @ n3 p4 {
9 y0 ?# }. v& f; U4、为防止重启后swap分区变成0,要修改/etc/fstab文件7 S, @. \( ^: R' z: x
vim /etc/fstab
5 e/ ~( e% K) x9 k, S8 n" L) @/ X1 ?在文件末尾(最后一行)加上:
+ @# ~3 s) x" E/ e/swap swap swap default 0 0
3 a6 T9 T$ ^) S# j+ K$ o3 i6 B7 ?. U/ s6 {' G
mount -a
) u5 B4 } @" C! H l8 K$ o) G& G( X" y7 h" _$ Q9 y9 ~1 B* U4 |$ n
扩容swap 分区:, p2 e, {2 ], p8 w- j9 [8 t
[root@kvmvm ~]# swapoff /swap
9 k/ a) J: s Z3 u( i& R5 H, N7 j: l
# dd if=/dev/zero of=/swap bs=1024 count=1048000
& D7 V4 J1 N: T0 U; M$ y5 d( r0 H1048000+0 records in
! I4 l" f! m7 v% E! U f& X1048000+0 records out
1 U7 [5 T L% I, A1073152000 bytes (1.1 GB) copied, 12.6694 s, 84.7 MB/s
- u0 x, V# H8 Y: T5 f. I' ]( _: D- E% Q% N- t
# dd if=/dev/zero of=/swap bs=1024 count=20550002 W( U% `3 n8 P: W
6 N/ `# E N! ^8 {. z# mkswap /swap
; d9 ]2 S3 n1 ?- j# wSetting up swapspace version 1, size = 2054996 KiB
$ X0 c; V" C& W; I3 ?no label, UUID=8dd77b7a-744a-452d-b991-5b2e01702464
( a* A; |8 m* }7 y0 b3 |# I) j- J8 p6 T' U7 x+ x# X z
& T( j! Y6 d0 M, H; |, D' N# swapon /swap
1 ?4 |8 s, V9 H3 F1 p4 Zswapon: /swap: insecure permissions 0644, 0600 suggested.
2 Z4 f$ G7 h( `swapon: /swap: read swap header failed: Invalid argument
/ W( f6 F3 x. L2 |* K L: o! h5 p& M% `& {$ [3 R
# mount -a5 O6 A. k8 L% n6 c0 ^0 g
6 _* D0 r9 ~0 `( U/ s1 g. f6 |. K
total used free shared buff/cache available
9 U9 g; x! t: |+ K+ @Mem: 31 1 27 0 2 29
! A6 T6 i# O: M, Z+ l$ U$ dSwap: 1 0 1
! B5 P. c# B; X3 k% f free -m
8 \! c! f* z: W total used free shared buff/cache available
{- d" Z1 o% `+ sMem: 32011 1037 28171 8 2802 30595
& [) @# D( ?7 ]$ R; l+ P, z3 |2 L* ESwap: 2006 0 2006% y5 [ \) T. H& F. k7 K
|
* p) R# l% L L' G2 U可参考这个值:
6 w! O% t# k/ i! f0 q
% X- g) c& d4 Z- R. ]https://www.bbs168x.cn/forum.php ... &highlight=swap' b! m# o* g3 U7 ?2 t7 s6 _( {
- v" c- {1 l3 z! G" D; F
6 G: n/ T6 o0 A8 b9 e- w ?
( T+ n# C( ^+ S( T. q- f! y2 G" B2 v: s- L5 N0 s) {4 }1 b
|
|