爱吱声

标题: 阿里云排雷 [打印本页]

作者: 可梦之    时间: 2023-5-17 14:48
标题: 阿里云排雷
喷了一下阿里云
7 G' l9 @9 U: q+ _( D3 e2 P. q
5 W  D2 |0 C! F在GPT4的帮助下,迅速找到了问题根源。
8 Y$ K/ c) O: x' l/ b6 j' @0 I/ |* p* B) s/ F
我的问题是:Ubuntu22.04中,kswap进程启动后,机器就卡死了。swap空间一点没占用。可能是什么问题?
' T. d. \1 }5 p( O4 }) R+ E4 p6 ], B/ W: x2 R
GPT4的回答是:
0 Y7 q: r% d& M# u) `
7 F) k7 h, b3 f
在 Linux 系统中,kswapd 是内核线程,它的主要职责是在系统内存压力大的情况下回收(释放)内存,以便给新的进程提供内存空间。它通过将内存中的数据移到 swap 空间(也就是硬盘)来实现这个功能。如果你看到 kswapd 进程占用了大量的 CPU 时间,并且系统变得非常缓慢,那可能是内存压力过大导致的。
" }! l! U6 i8 V- e! D( {) I& y6 L# x/ [3 D. t
然而,你提到 swap 空间没有被占用,这就比较奇怪了。这可能是由于以下几种情况导致的:8 J; U9 z5 u& H  m0 l# A

7 R$ \# C8 r  G内存泄漏:有一个或多个进程可能在不断地消耗内存,但没有正确地释放它。你可以使用 top 或 htop 命令来检查哪个进程占用了大量的内存。4 k7 X4 i$ ^4 ?8 @2 j* a7 W

& e% }. \6 Q( r9 i, BSwap 使用被限制或禁用:在某些情况下,系统可能被配置为尽量不使用 swap 空间。你可以通过 cat /proc/sys/vm/swappiness 命令来查看 swappiness 参数的值。这个值的范围是 0 到 100,数值越大,系统使用 swap 的可能性就越大。如果这个值非常低,你可能需要提高它。2 h9 J7 ^# B6 K- C! K5 s  D
0 G! C& d3 e/ z2 L0 M$ A& ?3 ]
错误的内存管理:在某些罕见的情况下,可能是由于内核的错误或硬件问题导致的内存管理问题。在这种情况下,你可能需要升级内核或检查硬件。0 T2 F& ~9 b- ^! o
) I! z* K% c. E: p2 B  h# Z
为了进一步排查问题,你可能需要更详细地监控系统的内存使用情况,并检查相关的系统日志。你也可以尝试使用一些内存管理和优化工具,如 earlyoom 或 nohang,来自动处理低内存情况。如果问题持续存在,你可能需要寻求专业的技术支持。

: E* u' m) d- `$ @( E! Q1 u0 |
. j. `# R: G( C! D1 v! k/ M) M我在Google中,后来找到正确关键字,在stackoverflow也找到正确答案:https://askubuntu.com/questions/ ... taking-a-lot-of-cpu' a9 O- M1 n! Z' T. L

5 E) M' t  U( d' c$ |' |在阿里云中,swappiness数值是0,也就是,永远不要使用swap分区。所以虽然我设置了swap,但是内存根本不会存到swap里,kswapd进程自己都拿不到内存。把最后一个bit的内存榨干后,系统完全当机。
& e' [1 l* t. u
& A: ^4 E! L6 [. W7 C2 L我修改这个数值为60后,就没有问题了。swap分区开始工作,ssh也可以连上。
- P1 V) }$ |9 Y  |( h' P9 F& o4 j8 M. _9 _* }, G) S
但是,这个数值在其他Ubuntu系统中都是60,不管是22.04/20.04/18.04,不管是AWS,ServaRICA还是我自己的服务器。阿里云的为什么这么特殊呢?& c+ e, T1 x2 b( H

1 ~2 B6 X8 a  y- v$ E7 }7 ^最后在/etc/sysctl.conf配置文件中,第一行赫然写着 vm.swappiness=0。而在其它系统中,配置文件里都没有这个设定。
0 E" U5 M  r" j
' {. \7 d; m+ B$ g6 x) C阿里为啥要改Ubuntu的默认配置?搜索了一下,在Google找到了阿里云的官方指导:https://developer.aliyun.com/article/1151641。页面虽然已经404了,但是Google cache还能看到:在服务器和容器平台建议关闭SWAP,避免内存交换影响服务器性能,甚至引发数据丢失。
5 I. u# a2 u3 ^0 c* K
6 u7 a7 d( M) a; E7 I* O但是,我们知道,不管你内存多大,都要开启swap。毕竟谁也不能保证你的内存是足够大的。自己家里机器随便折腾没事,服务器要24x365在线的。阿里云为什么这么反人类呢?我觉得有一个帖子说的对:“借此让用户购买更大的内存!”
/ z0 J3 K5 O9 l  L6 W
) V; w# \( w% A- ?喷完了,还要继续搞明白node为啥占这么多内存?我看node的进程数越来越大,貌似在不停的fork。当然也可能是内存泄露,swap分区最终也被占满了。
5 G3 G. I4 k& G% T! \* a% n. ]) l# t6 L: ?/ {

作者: 勤劳工作的猪    时间: 2023-5-17 15:01
猫腻真不少
作者: 老友    时间: 2023-5-17 16:24
草得嘞,阿里云这么流氓?很早很早以前玩solaris的时候,建议swap分区配置成物理内存的2~3倍。
作者: straw    时间: 2023-5-17 19:21
我们那种1T2T内存的机器,连swap都不建了。
) O4 H" d; m2 ?. f一般情况下swap还是要建的。当然太大也没意思,有个10g也就够了吧
5 S8 q- K. E) m# W# w  L
作者: 可梦之    时间: 2023-5-18 07:01
straw 发表于 2023-5-17 19:218 C! x% i. F- Q0 ?
我们那种1T2T内存的机器,连swap都不建了。
2 _5 a1 b% P; i% E; B  O$ {( Z一般情况下swap还是要建的。当然太大也没意思,有个10g也就够了 ...
) P+ `/ t0 u( ~2 e0 _
你可以默认不建swap分区,但不能偷摸让我建立了swap分区也不能用。我很难用善意去揣度他们这么折腾的目的。
作者: 季侯    时间: 2023-5-19 15:59
这个不得不说冤枉阿里云了,之所以将vm.swappiness默认设置为0,纯粹是因为技术原因。因为在云环境下,对磁盘的访问其实是通过网络访问分布式存储。如果使用swap,那么很多服务端软件的磁盘io变成了网络io,性能会急剧下降,这个对企业应用来说是不可接受的。
& W* H' P- |0 \9 f1 c2 j
! ?/ K1 ]. K* c5 i) D; J% C2 K这个设置貌似ecs刚上线时候没多久就确定了,应该还参考了ec2的设定,时间太久远,有点不记得了。另外阿里云ecs的帮助文档里面应该有关于这方面的说明。
作者: 可梦之    时间: 2023-5-19 19:16
季侯 发表于 2023-5-19 15:59
1 U4 L3 b# |- L; j$ n; r( y" a这个不得不说冤枉阿里云了,之所以将vm.swappiness默认设置为0,纯粹是因为技术原因。因为在云环境下,对磁 ...

* D1 ^9 X3 _$ E8 ^; k+ \$ T这个要商榷。现在网络数据是非常快的,尤其是同一机房内部,千兆起步。速度可能比一般的硬盘还快。我当初将DB服务器分离出去,最开始也有这个担忧。磁盘io变成网络io会变慢。后来发现是完全多虑了。
# ~0 ^' j- e6 {8 g4 w/ ?
) _6 v+ G, U! U  G& z( o$ ]要避免网络io,默认没swap分区就行了。用户想用自己创建swap分区自己承担责任就成了。AWS就是这么搞的。" E, Q0 X! {) {# f$ ^
" W6 e+ G0 E: W% Y, b8 Z2 E( {" M0 A
网络比硬盘慢,总比把内存耗光当机为好。服务器多层保护没啥不好,当你觉得意外不可能的时候,他总会发生。就是有T级的内存,也不能保证够用哦,不够了,慢点比挂掉好。再说了,要配置足够用的内存,不要多预留富裕多花钱吗。我觉得这才是阿里决策的重要原因吧。
作者: 阿忙    时间: 2023-5-19 21:23
可梦之 发表于 2023-5-19 06:166 \7 G. m, K+ b' |: p
这个要商榷。现在网络数据是非常快的,尤其是同一机房内部,千兆起步。速度可能比一般的硬盘还快。我当初 ...

, B/ L" D: F; Q我觉得你的一个点是非常对的,“要么干脆不让用户用swap,如果让用户开了swap,那么就必须让它是工作的”,阿里的现在的做法实在是无法理解,
作者: 季侯    时间: 2023-5-20 09:18
可梦之 发表于 2023-5-19 19:160 C" T4 ]* u; v0 r; E  y
这个要商榷。现在网络数据是非常快的,尤其是同一机房内部,千兆起步。速度可能比一般的硬盘还快。我当初 ...

$ ^1 g: s& c# h" |2 {! \千瓦网络并不快啊,其实在13/14年时候,阿里云机房里面已经是万兆网络了,现在估计已经是10万兆网络了。# d5 y, i$ v0 ~
6 ~& V0 U7 K, y$ `6 I0 ~2 Z3 a
另外最大问题是确定性,本来跑的好好的服务,突然变慢了,查来查去是因为使用了swap,从本地磁盘调用到了网络io,这个是很尴尬的。5 ~$ P, Z0 Y( I  H$ p, B4 K& o8 `

0 O; z0 \8 ~& w1 T当你只管理维护一两台服务的时候无所谓,如果要管理成千上万服务器时候,这种不确定性带来的问题是必须避免的。
/ g4 b4 C( J+ L) r. M$ S
/ a7 b" ^4 F+ |: c8 ?" X) y% D/ T  h另外这个配置应该是11/12年左右我定的,决定时候根本没有考虑让用户多用内存的因素,解决问题都来不及,哪有那闲心。
$ r. w; ?" {& [2 t6 n: }9 F' L2 d3 u+ J8 \" E4 ~4 s! @2 d3 W* v) Y
闲人一思考,上帝就发笑。
1 A, }. N+ t4 G( Q6 m0 L. ]5 y$ V  g* Y4 }; C5 z

作者: 赫然    时间: 2023-5-20 09:26
季侯 发表于 2023-5-19 20:18
3 [6 M" R# K: w, }2 J千瓦网络并不快啊,其实在13/14年时候,阿里云机房里面已经是万兆网络了,现在估计已经是10万兆网络了。( Z% e; K' T3 P% |$ k: t
...
1 @2 R  E' O3 z3 O+ C7 ~
正主现身了。。。。
9 p# e7 S* v( J* ~2 C( G) L- w, j2 o! X, v
这个配置应该是11/12年左右我定的

作者: 季侯    时间: 2023-5-20 11:50
季侯 发表于 2023-5-20 09:189 x! m' E7 ?8 f% J3 b; y- _# E
千瓦网络并不快啊,其实在13/14年时候,阿里云机房里面已经是万兆网络了,现在估计已经是10万兆网络了。
9 n$ B1 X( @0 G ...
5 Z2 R$ t" C& Q4 O7 V
这里应该有点记错了,13/14年时候,万兆网络只是试点
作者: 可梦之    时间: 2023-5-20 12:49
季侯 发表于 2023-5-20 09:18
& F7 O! M/ l; Z0 b9 O3 P千瓦网络并不快啊,其实在13/14年时候,阿里云机房里面已经是万兆网络了,现在估计已经是10万兆网络了。$ W4 r6 w+ j! {- Q! G  `3 U8 i! M2 x0 ^
...
9 M. }3 P8 J& [. N9 [# G
向专家请教一下:( u4 Z3 K8 z4 r1 t; ]2 z
1. 访问本地硬盘速度和通过网络访问同机房硬盘,速度能差多少?例如SATA III的速度大概是6Gbps,网络有多快?
1 y: W7 c4 w& S# v% u( d' R2.  硬盘访问是无法避免的,数据存储位置是不是也会考虑这个速度,就近放置?还是完全随机存放。后者能让用户感觉更一致吗?  R4 l7 V! r7 d' e$ |
3. 禁用swap,内存耗光了会怎样?我记得Linux会强制把一些高内存的进程给关掉。假如我内存固定是10G,用光后进程被杀死,不比变慢对用户来说更麻烦。而为了保证内存不被耗光,用户是不是要预留更多比如20G内存?还是有什么建议的策略?
0 S" T% D$ T, v9 Y; J) g1 U: Y4. 禁用swap了,能否禁用用户swap分区,或者用户创建swap分区的时候给个提醒?* s2 r' K# K1 D; K! O9 e
5. 主要速度差异应该是内存速度和硬盘/网络速度吧。swap的时候要把内存的数据dump到硬盘上去,肯定会让系统变慢,比较耗CPU的。  d% w! Z& o( x0 C& b) ~$ }
6. 当初是为了解决什么问题,服务变慢?内存快满了,肯定会慢,这个不正常吗?AWS是怎么解决类似问题的?
- B  c8 m1 g" T* C; d, A0 P  Z. E+ V6 G/ M- h4 X
多谢多谢。
作者: KXG    时间: 2023-5-22 05:19
可梦之 发表于 2023-5-20 12:49
; o) Q) S9 _4 L向专家请教一下:8 i, g0 F  f% y* M6 V; T( i
1. 访问本地硬盘速度和通过网络访问同机房硬盘,速度能差多少?例如SATA III的速度大概 ...
* A" q: J# N0 n. X: k& [
以亚马逊云类比:5 S3 ?- p1 R7 q; t# m+ [. t& v
网盘是云平台的共享资源,是有用度限制,要计量收费的。https://www.amazonaws.cn/ebs/pricing/% i. {9 c4 g: f' a+ B5 d( {
做缓存并不合适。实例存储可以是较好的选择:https://docs.amazonaws.cn/AWSEC2 ... nstanceStorage.html& z3 w# }# t. B% ^
: l9 K$ P( Y2 H# h) ]* m0 y

作者: 可梦之    时间: 2023-5-22 07:32
KXG 发表于 2023-5-22 05:19( ^6 [+ r  |# c9 g
以亚马逊云类比:
% b6 B6 Q% a, H$ \- j) q5 E/ c网盘是云平台的共享资源,是有用度限制,要计量收费的。https://www.amazonaws.cn/ebs/ ...
: u5 M  d3 `# u+ _
两个用的都是实例存储,没用网盘。
作者: KXG    时间: 2023-5-22 09:28
亚马逊的实例存储大概对应阿里云的本地盘,https://help.aliyun.com/document ... .0.0.1eeb53a6a8AAcJ$ G4 Y& k) z' Y
用作缓存应该没问题。
/ k. V* G$ e% L7 w  G我只有亚马逊和Azure经验,对阿里云只是瞎猜。
作者: 季侯    时间: 2023-5-24 15:50
可梦之 发表于 2023-5-20 12:49
' U' Q4 O" t" _6 W向专家请教一下:
/ t% ]! Y5 T! B2 ^) P( L3 m3 e1. 访问本地硬盘速度和通过网络访问同机房硬盘,速度能差多少?例如SATA III的速度大概 ...
1 x. T, D( U! ~' L. R% `* }6 C+ h
从你的问题来看,你不是从事相关技术领域研发或者维护过大规模服务器集群的,所以就不说太多细节了。, i" G) e4 ]% w- P
/ W6 h/ ~, e% O  F- G
我只提一点云存储是数据写三份并且三个物理机房,所以如果开启swap并使用,那么swap数据会写到异地的多个机房,如果存储本身出现一些峰值或者发布导致延时变大,这对一些延时敏感的应用来说,系统性能/延时会突然变得很差,又突然变好,这种不确定性对于系统稳定性是非常致命的。
作者: 可梦之    时间: 2023-5-24 17:02
本帖最后由 可梦之 于 2023-5-24 17:09 编辑 3 C9 D# \, h* c2 X3 Z; K: N0 t
季侯 发表于 2023-5-24 15:50( V3 c& ]2 @" d, b% g( d
从你的问题来看,你不是从事相关技术领域研发或者维护过大规模服务器集群的,所以就不说太多细节了。& z% z. r, e+ V0 n
( G# O/ L: H( t4 w9 X, n
我 ...
+ U2 L* F* Z2 |
' r# z: R1 \! }
我只是使用云服务的小客户。
1 b$ I1 Q" g7 Y* u: F) }; p9 C. K
( m& c& r' T5 K: r5 C7 N0 G& M那别的云服务商是怎么解决这个问题的。AWS并没有禁止掉swap。
8 t( s! I# L( F# R, {' @4 `) V% y/ k$ W2 P0 R  H  E! u, S
数据需要异地灾备我是知道的。但是这个肯定是异步的。本地机房的写好了就可以继续做事情了,不用卡着等异地同步好了。所以你说的问题我还是不太理解。可能对延时非常敏感的应用来说是的,但是这些客户本身就知道应该怎么去优化。对于大部分对这个时延不太敏感的用户,这么做完全没必要。
1 D! i8 L! ?1 O# j. E9 W- Q- H4 ~2 i0 d2 W
比如我32G的内存足够我的应用,但是为了以防万一,我放10G的缓存。如果不出意外,swap基本不会被使用。一旦出了什么情况,10G缓存是让时延变大,但是总好过应用被kill掉吧。而且绝大部分应用,即便不用swap,也要用磁盘吧。你的网络IO要是太不稳定,时延问题还是会遇到吧?
作者: 可梦之    时间: 2023-5-24 17:20
季侯 发表于 2023-5-24 15:50
7 E+ b5 c: s0 Q: R从你的问题来看,你不是从事相关技术领域研发或者维护过大规模服务器集群的,所以就不说太多细节了。/ @0 x3 q1 o$ @$ I6 k. Y! t

9 [1 ]8 ?0 b) d4 o我 ...

/ ]* M+ j# a/ {是这篇文章说的道理吗?https://developer.aliyun.com/article/194733
, N5 j8 x) p* ?, N4 n& e
( X! x9 `& \3 R9 t! I0 W# V. h服务器一般都会配置监控程序,当内存用量达到一个阈值的时候告警或者会自动重启异常的进程。但如果没有监控呢?当内存被用光的时候,分两种情况:
0 x5 Y' D2 |& ?8 V4 ?5 O) N0 N8 g% [+ ]5 F- |* N( Q0 b' c: |( W
配置了swap:这时服务器还能提供服务,但性能会降低好几个档次,直到最终处于几乎死机状态,并且这一过程将持续很长一段时间,对服务器来说是个灾难;所以配置swap只能让服务再苟延残喘一会儿,然后就是长时间的服务中断(比如原来是每秒处理1000个请求的服务器,由于频繁使用swap,导致现在每秒只能处理50个请求,站在系统角度,进程还在运行,但是在业务角度服务已经几乎中断了)。; h% [. f* @% b5 i0 D
没配置swap:这时内核的OOM killer被触发,在默认配置下,耗内存的进程会被优先kill掉,这种进程一般就是我们的业务进程,这时守护进程就会自动重启该业务进程(没有守护进程?开什么玩笑),这种情况只会造成服务中断一会会儿(取决于进程重启的时间),不会出现上面因配置了swap而导致性能很差且服务持续中断的情况。就算OOM killer没有kill掉预期的进程,我们通过测试也能发现,然后将OOM killer配置成重启系统,那也比配置了swap在那里苟延残喘的好。5 n9 B, Y/ z& s2 ?' R; o
从上面可以看出,对服务器来说,似乎不配置swap更好,可以让有问题的进程尽快重启,缩短业务受影响的时间。
作者: 季侯    时间: 2023-5-26 11:51
可梦之 发表于 2023-5-24 17:200 k; [8 Y% K+ N! w6 r2 a& B
是这篇文章说的道理吗?https://developer.aliyun.com/article/1947331 Q3 @- N% z0 P/ J' n- }# p

2 n) l! A* c7 s# ?9 V# q服务器一般都会配置监控程序,当 ...
0 ^) R" _. E/ g, a: X
这是原因之一吧




欢迎光临 爱吱声 (http://www.aswetalk.net/bbs/) Powered by Discuz! X3.2