系统瓶颈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) 收藏 举报
浙公网安备 33010602011771号