TA的每日心情 衰 2021-2-2 11:21
签到天数: 36 天
[LV.5]常住居民I
在Zen And The Art Of Scaling - A Koan And Epigram Approach中,Russell Sullivan提出了一个非常有趣的总结:软件开发常见的20个传统的系统瓶颈,这听起来像是说有20个故事情节,并且依赖于你如何策划这些故事,或许都是真的,但唯有实践才知道它们带给我们的酸甜苦辣。# S0 ?* e# M* B' |, p0 Z5 _ v
: r3 P |9 O7 M$ i1 l1 Y 有一天,Aurelien Broszniowski给我发了一份电子邮件,把这些瓶颈用列表的方式展示出来。在接下来的交谈过程中,我又把该列表抄送给了Russell,Russell对此列表进行了整理。
/ Q# y1 ?" Q% @7 |4 m 3 K7 b0 e8 N# w5 Y. t( i& W
/ F( j' ^0 d9 p% i
& R# K. t( W2 X( G& ?* D
G9 p' \& _" |) y1 V/ F; | Russell说:“我真希望在年轻时看到这样的一份列表”。伴随着经验的增长、项目的增多、解决各种不同类型的问题和不断总结各种经验教训,你会在这份列表上添加更多的东西。所以,当你在阅读该份列表时就像是在回顾一个个故事片段。! v/ y7 d1 J4 v+ M2 u1 |! K0 K" f
) T3 \* X7 K5 t
数据库
4 Q% k$ @: P0 Q& K
* I" u+ R) @5 V6 n( l2 T 工作任务内存超过可用的RAM内存7 `) }, U+ D3 |1 e( G! v
长/短查询
8 _0 f7 G `( c- Y$ x; M3 \5 y$ Y 写入冲突
+ G5 Y! p6 f" t2 H# e3 N" { 大连接(join)占用内存
- X5 Y8 a/ C" T, G6 _( l 虚拟化9 K; v' D$ \* j! N; O3 s+ F5 u
. X, W3 n' S( ]8 Z4 a# l
共享一个HDD、磁盘寻死(disk seek death)0 `2 _$ Y* O% \2 v
在云端网络 I/O波动 A! a, P+ [! a
编程+ E+ U2 e+ Y4 D: h; {3 G
8 n* x- H0 y; x. ]7 K# O 线程:死锁、调试、非线性扩展等! V# b2 O3 z+ o4 B, t3 R
事件驱动编程:callback()过于复杂、如何在函数调用中存储有状态等5 l' m8 j5 Y7 g7 N
缺乏调优、跟踪、日志等
6 S- J8 N* c2 M, Y% l) Y! J7 m 单模块不可扩展、单点故障(SPOF:Single Point Of Failure)、非横向扩展等
' w6 P0 e A2 I+ X; D$ M4 y 有状态应用程序8 m# x2 |. E3 V6 h2 a' U
设计问题:开发的应用程序只在自己的机器行运行正常,或者只是在几个人测试的时候正常(没有经历压力测试)。
* i: n, p3 H$ f8 @% T' {% W* o 算法过于复杂% D% L1 m0 d4 j" b1 L# H
相关服务,例如DNS查找以及其他可能屏蔽的服务 W, V8 y9 n. [! E) e( y: }
堆栈空间8 F6 |; e, L+ C, w" m/ Y
磁盘
. F# Q$ {' r6 ]4 e+ ]
/ X* i( u3 _' c! k j$ L4 \ 访问本地磁盘
, p- W1 K; K6 n1 L; @+ X 随机访问磁盘I/O) j. \7 W5 Q. b( Z1 e0 t, u7 B% m, l
磁盘碎片
& n' K, j8 Y2 _& ~4 a- y 当SSD写入的数据大于SSD容量时,性能会下降+ F/ L1 v6 f# d0 }; x
OS
, G5 a: c3 }/ e3 S % w! J v0 v: }3 k/ G
Fsync饱和,Linux缓冲区填塞(Fsync flushing, linux buffer cache filling up)
% i8 d, K$ l0 n: Z4 R TCP缓冲区太小
# A* k8 d& ^; B" u8 t: Y E 文件描述符限制7 o6 f& p# I+ J6 ~/ M
功率分配(Power budget)
8 ^( Z( b( B. y 缓存- f W% g8 v8 v2 q S7 G
* H( y# z; P# I, i3 r7 f8 n! {6 B 没使用memcached(数据库崩溃)
# d- L6 X7 x6 E* \8 j6 P8 I9 e HTTP中:headers、etags、没有使用gzip压缩等。
! e( W1 r7 k/ J- L, S1 E- G 没有充分利用浏览器缓存# G4 y" R- ? X
字节码缓存(如PHP)
* n; x6 t2 {9 b8 N- L$ I$ i L1/L2缓存:这是个令人头疼的大瓶颈。把关键并且经常访问的数据存储在L1/L2中。这涉及到很多:snappy网络I/O,列数据库直接在压缩数据上运行算法等。利用一些技术不销毁你的TLB。最重要的思想是紧紧的抓住计算机的体系结构,涉及多核CPU,L1/L2,共享的L3,NUMA RAM,从DRAM到芯片数据传输带宽/延迟,DRAM缓存的DiskPages,DirtyPages,流经CPU<->DRAM<->NIC的TCP包。- W% f+ j. S0 `
CPU6 o T3 [9 l, X! ~. B! X U* A
5 G2 H' l$ Z2 t) C8 e CPU过载* E3 `6 t1 m+ _- _( h& V
内容切换—>单核上开启的线程过多、Linux调度器、系统调用太多等
$ Q7 D* j) ?8 D4 ]6 F4 H IO等待—>所有的CPU在同速等待( ~: Y; L; d9 }
CPU缓存:缓存数据是一个细粒度进程,为了在多个实例与不同的值数据之间找到正确的平衡,来保持缓存数据的一致性和繁重同步。" j7 ]/ ]; F9 E! f/ o r
底板吞吐量(Backplane throughput)* Z: {4 i% }, ^
网络2 O* l: i* R9 t1 S! D0 v3 [
( h0 U2 s* b4 |: a/ I NIC刷爆、IRQ饱和、软中断占用掉了100%CPU% z3 h! s+ D" a
DNS查询
4 K; W s0 \( j& a0 v 数据包丢失
$ c6 f( v& F- R% G 网络中存在预期外的路由
/ f; b$ f# u0 C6 |6 I5 `2 i 访问网络磁盘
& A+ @) [7 ? N5 l H 共享SAN1 T1 Q6 `- ^! ^( K0 J# Q: _" ~
服务器故障—>无法从服务处得到响应
3 l5 [* L E; n1 A/ Z# B+ Y 进程
, r8 f( D: ~" }( C7 _ t( K4 E: M
4 l$ d. J/ F4 P8 v: B 测试时间
7 _& d/ `) d+ n s 开发时间
! X8 ~+ p2 s! h! y 团队规模; s1 K( S2 t( v" [& @8 l7 n$ a' a
预算
4 f" w* ?3 O/ `. W# E 代码债务! j% _% U+ C! M, c- Z! C# I, H
内存1 I0 |& C3 ~& o8 P
5 l1 {1 [* H; B4 |% |$ [6 `- `
内存不足—>杀死进程,切换到swap,挂起
% W6 a$ {0 ~! d 内存不足导致磁盘交换(与swap相关)6 }) m+ Z5 p$ @7 S0 E
记忆库开销过大(Memory library overhead)
- X/ D. F! Y+ A' X# ?% `' W5 _ 内存分片(在java 中需要会因为内存回收而停顿;在C中,malloc总是开始分配内存)
' U6 ?) l! M2 X: K& m% S- b 8 D$ M! i4 B# H2 ]3 r& W3 c
原文:http://highscalability.com/blog/ ... on-bottlenecks.html
5 u j5 P7 P6 I/ Z+ A, F8 z
( V- F# o# m, \+ t+ \
科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关2、本站所有主题由该帖子作者发表,该帖子作者与科帮网 享有帖子相关版权3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网 的同意4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意7、科帮网 管理员和版主有权不事先通知发贴者而删除本文
JAVA爱好者①群:
JAVA爱好者②群:
JAVA爱好者③ :