系统瓶颈20点

原文地址:http://highscalability.com/blog/2012/5/16/big-list-of-20-common-bottlenecks.html

 个人根据理解翻译了一些,用于个人笔记,如有问题,还请指正

  • 数据库:
    • 内存使用超出
    • 查询问题(过长、过短)(过短本人理解为太短应该考虑缓存神马的)
    • 写入内容冲突
    • 大联接查询狂吃内存
  • 虚拟化:
    • 共享一个硬盘,硬盘读数据累死
    • 云中的网络io不稳定
  • 程序方面:
    • 多线程问题: 死锁, 事件比对等重操作, 调试, 非线性扩张等等
    • 事件驱动型: 回调复杂度, 函数调用重存储状态等问题
    • 缺少分析、调试和日志信息
    • 不可伸缩的一坨, 单点故障, 非水平扩展等等
    • 程序中有状态信息(高扩展要求最好无状态)
    • 设计太破啦:开发时没啥问题,刚运行也挺好,有点用户,过点时间,还未达到设计饱和量时就挂掉了,需要重新来过(然后再循环 )
    • 算法复杂度(部分实现太复杂)
    • 总是依赖一些需要等待的服务,比如DNS查询
    • 栈空间问题(过于复杂的调用,递归等)
  • 磁盘方面:
    • 本地磁盘读取
    • 随机磁盘读取导致频繁寻道
    • 磁盘碎片
    • 向SSD磁盘写入超出容载量之数据
  • 操作系统方面:
    • Fsync刷新,linux缓冲区满了,堵塞了
    • TCP缓存过小
    • 文件打开数限制问题
    • 功率分配问题
  • 缓存:
    • 没使用类似memcached的缓存系统 (连续访问数据库,它累啊)
    • HTTP方面: 头部, etags标示, gzip开启状态等等
    • 没有充分发挥浏览器的缓存(能丢给客户浏览器的使劲丢啊)
    • 操作码(指令码)缓存 (例如PHP)
    • L1/L2 缓存. 这个当然是最最大的瓶颈了(系统级,不然它们也不会这么贵J),重要数据保存在L1/L2缓存. 这将有很大的提升,比如网络io,数据库压缩算法等. 有一系列方法不用销毁TLB(本地线程缓存) 最重要的一点是按照电脑架构来说,以多核、L1/L2缓存,共享L3缓存(以上属于cpu层级内),NUMA 内存,主板内存的带宽和延迟,内存到磁盘页面置换,脏页,网络数据传输(TCP)这个递减的顺序来保存
  • CPU:
    • CPU过载
    • 上下文切换:单核上过多的线程,系统调度中等待过多(bad luck w/ the linux scheduler),太多的系统调用等等
    • 程序阻塞在IO等待上,cpu都闲置了
    • CPU缓存: 缓存数据是一个细粒度的方法(java中使用volatile),是为了在多实例不同数据和沉重操作同步之间寻求一个正确平衡
    • 背板吞吐量。(见http://en.wikipedia.org/wiki/Backplane,个人理解主板bus带宽和附加通道带宽比如pci等)
  • 网络:
    • NIC负载满(刷爆), IRQ饱和, 软中断,消耗了100%的cpu
    • DNS查询等待
    • 丢掉的网络包
    • 网络中出现非意料的路由导致网络包传输时间过长
    • 网络磁盘访问
    • 共享SAN
    • 依赖服务器挂掉,无响应,系统等待。
  • 软件开发流程(有翻译为进程,个人认为不妥):
    • 测试时间
    • 开发时间
    • 团队规模
    • 各方面预算
    • 代码负债(未实现的功能…)
  • 内存:
    • 内存溢出,导致结束进程,系统SWAP,甚至宕机
    • 内存溢出导致磁盘交换(和swap相关)
    • 内存库开销过大(非操作系统实现的内存池等)
    • 内存碎片问题
      • Java中gc,gc会导致停顿
      • C中,总是以malloc开始

 

posted on 2012-12-20 13:36  stevengogo  阅读(100)  评论(0)    收藏  举报

导航