`

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

    博客分类:
  • java
 
阅读更多
在Zen And The Art Of Scaling - A Koan And Epigram Approach中,Russell Sullivan提出了一个非常有趣的总结:软件开发常见的20个传统的系统瓶颈,这听起来像是说有20个故事情节,并且依赖于你如何策划这些故事,或许都是真的,但唯有实践才知道它们带给我们的酸甜苦辣。

有一天,Aurelien Broszniowski给我发了一份电子邮件,把这些瓶颈用列表的方式展示出来。在接下来的交谈过程中,我又把该列表抄送给了Russell,Russell对此列表进行了整理。

Russell说:“我真希望在年轻时看到这样的一份列表”。伴随着经验的增长、项目的增多、解决各种不同类型的问题和不断总结各种经验教训,你会在这份列表上添加更多的东西。所以,当你在阅读该份列表时就像是在回顾一个个故事片段。

数据库

    工作任务内存超过可用的RAM内存
    长/短查询
    写入冲突
    大连接(join)占用内存

虚拟化

    共享一个HDD、磁盘寻死(disk seek death)
    在云端网络I/O波动

编程

    线程:死锁、调试、非线性扩展等
    事件驱动编程:callback()过于复杂、如何在函数调用中存储有状态等
    缺乏调优、跟踪、日志等
    单模块不可扩展、单点故障(SPOF:Single Point Of Failure)、非横向扩展等
    有状态应用程序
    设计问题:开发的应用程序只在自己的机器行运行正常,或者只是在几个人测试的时候正常(没有经历压力测试)。
    算法过于复杂
    相关服务,例如DNS查找以及其他可能屏蔽的服务
    堆栈空间

磁盘

    访问本地磁盘
    随机访问磁盘I/O
    磁盘碎片
    当SSD写入的数据大于SSD容量时,性能会下降

OS

    Fsync饱和,Linux缓冲区填塞(Fsync flushing, linux buffer cache filling up)
    TCP缓冲区太小
    文件描述符限制
    功率分配(Power budget)

缓存

    没使用memcached(数据库崩溃)
    HTTP中:headers、etags、没有使用gzip压缩等。
    没有充分利用浏览器缓存
    字节码缓存(如PHP)
    L1/L2缓存:这是个令人头疼的大瓶颈。把关键并且经常访问的数据存储在L1/L2中。这涉及到很多:snappy网络I/O,列数据库直接在压缩数据上运行算法等。利用一些技术不销毁你的TLB。最重要的思想是紧紧的抓住计算机的体系结构,涉及多核CPU,L1/L2,共享的L3,NUMA RAM,从DRAM到芯片数据传输带宽/延迟,DRAM缓存的DiskPages,DirtyPages,流经CPU<->DRAM<->NIC的TCP包。

CPU

    CPU过载
    内容切换—>单核上开启的线程过多、Linux调度器、系统调用太多等
    IO等待—>所有的CPU在同速等待
    CPU缓存:缓存数据是一个细粒度进程,为了在多个实例与不同的值数据之间找到正确的平衡,来保持缓存数据的一致性和繁重同步。
    底板吞吐量(Backplane throughput)

网络

    NIC刷爆、IRQ饱和、软中断占用掉了100%CPU
    DNS查询
    数据包丢失
    网络中存在预期外的路由
    访问网络磁盘
    共享SAN
    服务器故障—>无法从服务处得到响应

进程

    测试时间
    开发时间
    团队规模
    预算
    代码债务

内存

    内存不足—>杀死进程,切换到swap,挂起
    内存不足导致磁盘交换(与swap相关)
    记忆库开销过大(Memory library overhead)
    内存分片(在Java中需要会因为内存回收而停顿;在C中,malloc总是开始分配内存)
分享到:
评论

相关推荐

    实时软件开发的25个常见错误

    这篇文章《实时软件开发的25个常见错误》旨在帮助开发者避免在项目中犯下这些常见的失误,从而提高软件质量和性能。以下是这些错误的详细解释: 1. **忽视实时性需求**:开发人员必须清楚地理解系统的实时要求,...

    Linux系统瓶颈分析

    ### Linux系统瓶颈分析 #### 一、性能监控与优化概览 在Linux系统环境中,性能优化是一项关键的任务,它能够确保系统的稳定运行和高效利用。性能优化的核心在于识别并解决所谓的“瓶颈”,即那些限制系统整体性能...

    软件开发者要记住的十大操作系统概念

    在软件开发领域中,操作系统的概念是至关重要的基础知识点。理解操作系统的基本原理、机制及实现,对于开发高性能、结构合理的软件是必不可少的。文章中提到的三个主要类型的操作系统是Mac OS、Windows和Linux。它们...

    小组软件过程PPT 软件开发

    2. **过程模型**:可能涵盖了敏捷、瀑布、螺旋等不同软件开发模型,并解释了为何在小组环境中选择TSP更为合适。 3. **度量与分析**:讨论如何收集和分析数据,以评估团队和个人的性能,以及如何利用这些数据来指导...

    电脑硬件瓶颈监控检测系统

    硬件瓶颈是指在电脑运行过程中,某一或某几部分硬件性能不足,限制了整体系统性能的提升。例如,CPU、GPU、内存和硬盘I/O等,任何一环的短板都可能导致整体性能下降。电脑硬件瓶颈监控检测系统通过专业的分析算法,...

    一种基于Matlab的生产系统瓶颈单元智能发掘方法.pdf

    TOC理论认为,任何系统都有至少一个约束或瓶颈限制其性能,这种约束因素是系统中的关键所在,对它们的识别和管理是提升系统整体表现的关键。在生产系统中,约束理论帮助我们理解和找到限制整个系统产能输出的单元。 ...

    实时软件开发中二十五个最常见错误

    本文主要探讨了二十五个在嵌入式实时软件开发中最常见的错误,涵盖了从项目管理到具体的技术实施层面。以下是对这些错误的详细分析: 1. **忽视需求分析**:在开始编码之前,不充分理解或忽视对系统需求的详细分析...

    中间件技术在武器系统软件开发中的研究与应用的开题报告.docx

    ### 中间件技术在武器系统软件开发中的研究与应用 #### 一、研究背景 随着现代武器系统的不断升级与更新,其内部软件系统的复杂度也随之大幅增加。这不仅增加了开发难度,同时也对软件的性能、可靠性和安全性提出...

    软件系统性能检测与瓶颈分析

    软件系统性能检测与瓶颈分析是IT领域中一项至关重要的任务,尤其在中国软件评测中心的培训课程中占有显著地位。这个过程旨在确保软件系统的稳定性和效率,以满足用户需求和业务目标。性能检测是为了评估系统在特定...

    精益软件开发管理之道1

    在实际应用中,精益软件开发管理通常结合敏捷方法,如Scrum或Kanban,以实现更灵活、更高效的开发流程。例如,Scrum的sprint周期可以用来定期检查和调整工作流程,而Kanban则强调可视化工作流程,以便更好地管理任务...

    软件开发的相关实施原则(通用版本).docx

    这个原则可以避免软件系统中的性能瓶颈,提高软件系统的整体性能和可靠性。 第四, 可用性原则是软件开发的重要原则。这个原则要求软件系统能够满足用户应用和稳定运行的需求,确保软件系统的可用性和可靠性。这个...

    开发软件调度系统.zip

    在开发软件调度系统的过程中,Java作为一种广泛使用的编程语言,扮演着至关重要的角色。本文将深入探讨基于Java的软件调度系统的设计与实现,以及其相关的技术要点。 首先,我们需要理解“调度系统”的概念。调度...

    03173软件开发工具自考知识点汇总-前6张

    【标题】03173软件开发工具自考知识点汇总-前6张涵盖了软件开发过程中常用的工具和技术,这些知识点对于自学者来说至关重要。在软件开发领域,工具的选择和使用直接影响到项目的效率和质量。以下是对这些关键知识点...

    ASP.NET应用中十大常见的潜在问题

    ### ASP.NET应用中十大常见的潜在问题 在ASP.NET应用程序开发过程中,开发者经常会遇到各种各样的技术挑战和陷阱。这些问题如果不加以注意,可能会严重影响应用程序的性能、安全性和用户体验。以下是根据提供的部分...

Global site tag (gtag.js) - Google Analytics