我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > 软件开发中常见的十大系统瓶颈
总共48086条微博

动态微博

查看: 1521|回复: 1

软件开发中常见的十大系统瓶颈

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    楼主
    发表于 2015-08-10 16:52:45 |只看该作者 |倒序浏览
    在Zen And The Art Of Scaling - A Koan And Epigram Approach中,Russell Sullivan提出了一个非常有趣的总结:软件开发常见的20个传统的系统瓶颈,这听起来像是说有20个故事情节,并且依赖于你如何策划这些故事,或许都是真的,但唯有实践才知道它们带给我们的酸甜苦辣。
    6 T: Y, L' k, U9 A8 Y' t4 [8 `% B6 w: U) ^8 I* ]* b! A* ^' D
    有一天,Aurelien Broszniowski给我发了一份电子邮件,把这些瓶颈用列表的方式展示出来。在接下来的交谈过程中,我又把该列表抄送给了Russell,Russell对此列表进行了整理。
    : k  W7 n1 p7 e+ s. r
    4 _4 B/ t* p& c3 b
    9 D7 B& ~2 `' K: i8 t
    7 k3 Q# j. l- X9 g- e9 l) N! y! C7 r3 a" `" k0 ?% I3 b- ]4 j" q% R% E
    Russell说:“我真希望在年轻时看到这样的一份列表”。伴随着经验的增长、项目的增多、解决各种不同类型的问题和不断总结各种经验教训,你会在这份列表上添加更多的东西。所以,当你在阅读该份列表时就像是在回顾一个个故事片段。
    : X  w- A# H' x, B$ t7 N: K& H0 Z7 I- S$ j5 M
    数据库
    ' J! ?. F! G% W! j* g6 j  u1 s
    3 M) o: G$ L& D2 P! o- J工作任务内存超过可用的RAM内存
    & B' R5 \2 i/ e/ x% N, l4 l长/短查询
    4 w# ^9 E/ V2 {4 X$ ~写入冲突7 v% S' f/ C# }4 @
    大连接(join)占用内存
    1 z! [$ f. {3 R0 W虚拟化
    2 f: t; y1 \6 b+ h8 B+ w  i# C
    ! D1 j8 }8 D# j' B# ~共享一个HDD、磁盘寻死(disk seek death)
    / |9 t( q1 M0 f+ {+ D6 H  ]' X2 F4 q在云端网络I/O波动/ I; D; e# C6 I6 i
    编程* D0 e1 r" e+ E& D

    2 f  P9 K  n, Z7 i9 I线程:死锁、调试、非线性扩展等
    ; x" x) l. c9 Q7 ^. l4 I事件驱动编程:callback()过于复杂、如何在函数调用中存储有状态等% ~' B2 O* Z. x2 I
    缺乏调优、跟踪、日志等9 z1 L- e( O3 L! h1 O7 l6 G
    单模块不可扩展、单点故障(SPOF:Single Point Of Failure)、非横向扩展等1 `  t* m. I" @6 ^/ f# _
    有状态应用程序
    $ h% i3 U6 |, s设计问题:开发的应用程序只在自己的机器行运行正常,或者只是在几个人测试的时候正常(没有经历压力测试)。, l& A) V' o, v- G! E+ Z
    算法过于复杂
    0 L: k. E0 G& c7 M: n相关服务,例如DNS查找以及其他可能屏蔽的服务
    ( O- b' V1 P& V( T* i堆栈空间
    9 N$ j! R9 i0 \% a1 M$ \, f磁盘' [8 W# I! [5 G9 Y) d  b

    : W" h1 G$ V3 j1 }$ ~5 ~! B4 W访问本地磁盘0 @4 A4 [: L. G( p$ d( I
    随机访问磁盘I/O
    3 F* m, b: f$ ~$ w$ c! N# w磁盘碎片
    / \4 V4 y: f: }/ f4 H" o当SSD写入的数据大于SSD容量时,性能会下降
    3 E$ c3 w8 a$ A- b0 C' I0 |OS
    ' A' p3 _5 N9 c( G5 n  C# W! R4 i$ T8 W
    Fsync饱和,Linux缓冲区填塞(Fsync flushing, linux buffer cache filling up)  r3 X" f  m. G+ J6 J/ y
    TCP缓冲区太小5 y- y5 L& W+ \/ z, D% _2 _$ }0 F
    文件描述符限制0 t; H. k9 M, }5 O; I
    功率分配(Power budget)5 J! x& R& m# _5 m! C% `4 C
    缓存
    & |3 c" k# o1 [- ^% w* ^1 d  c9 B4 e' {; {
    没使用memcached(数据库崩溃)- X5 e$ j2 v9 c! v% {* Y7 O3 d0 Z
    HTTP中:headers、etags、没有使用gzip压缩等。
    # ~- x3 R% o% I" n( r! @没有充分利用浏览器缓存
    & v; Z. d+ H$ O# _" d9 v4 Q字节码缓存(如PHP)# m4 W. q5 f% D
    L1/L2缓存:这是个令人头疼的大瓶颈。把关键并且经常访问的数据存储在L1/L2中。这涉及到很多:snappy网络I/O,列数据库直接在压缩数据上运行算法等。利用一些技术不销毁你的TLB。最重要的思想是紧紧的抓住计算机的体系结构,涉及多核CPU,L1/L2,共享的L3,NUMA RAM,从DRAM到芯片数据传输带宽/延迟,DRAM缓存的DiskPages,DirtyPages,流经CPU<->DRAM<->NIC的TCP包。8 e  d7 |& T2 H+ G" L; ]
    CPU
    $ X- |1 d; w# L( ~) \7 Q* M/ X; w. m  _, P" {
    CPU过载
    ' M' k3 e7 u; d) ?9 X2 t内容切换—>单核上开启的线程过多、Linux调度器、系统调用太多等
    : x+ D9 I, m0 c+ D6 \( ?IO等待—>所有的CPU在同速等待9 i- x" T# {; \* L
    CPU缓存:缓存数据是一个细粒度进程,为了在多个实例与不同的值数据之间找到正确的平衡,来保持缓存数据的一致性和繁重同步。' x  N. v; r9 C# q
    底板吞吐量(Backplane throughput)
    $ z3 o0 }" O& o" [- z  O1 J网络
    5 x1 ~% h% K/ K9 `0 R6 D
    / }$ v$ k# I+ F( {, VNIC刷爆、IRQ饱和、软中断占用掉了100%CPU: N  p. ?, Y0 U# Z& v
    DNS查询+ N5 t! `& G3 U7 o( B' k
    数据包丢失
    9 _6 E$ z9 K4 G网络中存在预期外的路由" V' {4 o; O- Q/ i
    访问网络磁盘" r& v3 k+ ~( M3 e
    共享SAN
    9 h! @; C" ~, ^) Z0 i$ K; b( f, V服务器故障—>无法从服务处得到响应
    # w" S* P. G" ?& Z5 t进程! q) h; ~# W( }" n) K9 j) [

    7 `# ^, O4 r: |( _0 B- G测试时间
    0 \9 s  Z2 B5 ^1 `, n( W' D开发时间( V( i" c- W8 u' F# l, K
    团队规模
    # D3 s" {; {# G6 f. ^; F预算
    & a; F1 A* z4 `1 }' U代码债务
    : W. @" j. j5 R0 m/ t( F' B内存  T3 Y: I- j5 F; F

    ) K, J- r: @: _2 W* [内存不足—>杀死进程,切换到swap,挂起" s& B0 t1 K) M% k/ X) f
    内存不足导致磁盘交换(与swap相关), V3 R9 n4 a& F  J; Z+ _% ?
    记忆库开销过大(Memory library overhead)
    & A1 }; g/ @. ^7 I& Q/ O内存分片(在java中需要会因为内存回收而停顿;在C中,malloc总是开始分配内存)
    ; p* t% n# b+ I) I0 [" I- M* b  w9 y- ~, D3 u
    原文:http://highscalability.com/blog/ ... on-bottlenecks.html
    3 X/ s# p! ^6 u" o* d3 t
    + v* \# r' {! [+ D/ ?9 l

    科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    46

    主题

    1

    听众

    584

    金钱

    三袋弟子

    该用户从未签到

    80后

    沙发
    发表于 2016-10-30 12:06:48 |只看该作者
    这篇文章需要转载,,,,很有意义的总结
    回复

    使用道具 举报

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    关闭

    站长推荐上一条 /1 下一条

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表