Java 性能调优工具箱之操作系统的工具和分析

本贴最后更新于 2053 天前,其中的信息可能已经时移世易
  1. CPU 使用率

    通常 CPU 使用率可以分为两类:用户态时间和系统态时间。用户态时间是 CPU 执行应用代码所占时间的百分比,而系统态时间则是 CPU 执行内核代码所占时间的百分比。系统态时间与应用无关,比如应用执行 I/O 操作,系统就会执行内核代码从磁盘读取文件,或者将缓存数据发送到网络等。任何使用底层系统资源的操作都会导致应用占用更多的系统态时间。

    性能调优的目的是:在尽可能短的时间内让 CPU 使用率尽可能地高。

    CPU 使用率是一段时间内的平均数——5 秒、30 秒,也可能只有 1 秒那么短。比如 10 分钟内一个程序执行的 CPU 使用率为 50%。如果代码调优之后,CPU 使用率达到了 100%,说明程序的性能翻了倍,程序只需要执行 5 分钟就可以了。如果性能再翻倍,CPU 仍将是 100%,而执行完程序只要 2.5 分钟。CPU 使用率表示程序以多高的效率使用 CPU,所以数字越大,性能越好。

    如果再 Linxu 桌面系统上运行 vmstat 1,可以得到类似如下的几行信息(每隔 1 秒显示一行)
    捕获.PNG

    字段说明:

    procs(进程)

    字段名 字段名解释
    r 运行队列中进程数量
    b 等待 I/O 的进程数量

    memory(内存)

    字段名 字段名解释
    swpd 使用虚拟内存大小(单位:B)
    free 可用内存大小(单位:B)
    buff 用作缓冲的内存大小(单位:B)
    cache 用作缓存的内存大小(单位:B)

    swap(交换内存)

    字段名 字段名解释
    si 每秒从交换区写到内存的大小
    so 每秒写入交换区的内存大小

    IO

    字段名 字段名解释
    bi 每秒读取的块数
    bo 每秒写入的块数

    system

    字段名 字段名解释
    in 每秒中断数,包括时钟中断
    cs 每秒上下文切换数

    CPU(以百分比表示)

    字段名 字段名解释
    us 用户进程执行时间
    sy 系统进程执行时间
    id 空闲时间(包括 IO 等待时间),中央处理器的空闲时间。以百分比表示
    wa 等待 IO 时间

    每秒内,CPU 被占用 300 毫秒(27% 的时间执行用户代码,3% 的时间执行系统代码),相应地,CPU 空闲 700 毫秒。CPU 空闲可能有一下原因:

    • 应用被同步原语阻塞,直至锁释放才能继续执行。

    • 应用在等待某些东西,例如数据库调用所返回的相应。

    • 应用的确是无所事事。

    前面两种情况通常都可用来识别某些问题。如果竞争降低,或优化数据库使之发送响应更快,程序运行都能变得更快,平均 CPU 使用率也会上升(当然得假设没有其他继续阻塞应用的问题)。

    关于第三点,可能会有些困惑。如果应用有事情做(而不是等待锁或者其他资源而无所事事),CPU 就会分配一些周期执行应用代码。这是一般性原则,而不只针对 Java。比如,包含无线循环的简单脚本。这段脚本执行时,将消耗 100% 的 CPU。

    ECHO OFF
    :BEGIN
    ECHO LOOPING
    GOTO BEGIN
    REM We never get here……
    ECHO DONE

    如果这段脚本没有消耗 100%CPU,那以为着操作系统还有些事可做——它可以答应一行 LOOPING——却选择了空闲。这种情况下,空闲并没有什么好处,如果我们正在进行一些有用(耗时)的计算,那么迫使 CPU 周期性空闲只会使我们得到响应的时间变得更长。

    操作系统擅长为争用 CPU 周期的程序分配时间片,但新程序可用的 CPU 变少了,它也就运行得更慢,所以基于这种经验,人们有时会认为,在其它程序可能需要 CPU 周期时预留一些空闲周期,没准是个好主意,但操作系统无法猜到你接下来想做什么,所以(默认情况下)它会尽可能执行一切而不是让 CPU 空闲

  2. CPU 运行队列

    前面 vmstat 的输中,r 是所有正在运行或待运行的进程数。示例中至少有二个线程试图运行。运行队列反应的是机器上所有东西的运行情况。如果试图运行的线程数超过了可用的 CPU,性能就会下降。一般来说,Windows 的处理器队列长度最好为 0,小于或等于 Unix 系统 CPU 的数目。不过这也不是硬性规定。有些系统或其他进程会周期性出现,在这瞬间数字会有提高,这对性能不会有实质性影响。但是,如果想当长时间内运行队列很长,说明系统已经过载,这是你应该检查系统,减少机器正在处理的工作量(将工作转移到其他机器或者优化代码)

总结

  1. 检查应用性能时,首先应该审查 CPU 时间

  2. 优化代码的目的是提升而不是降低(在更短时间段内)CPU 使用率

  3. 在试图深入优化应用前,应该先弄清楚为何 CPU 使用率低

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8216 回帖 • 4 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    300 引用 • 768 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
AutisticV5
简单很快乐,快乐很简单。 广州

推荐标签 标签

  • 旅游

    希望你我能在旅途中找到人生的下一站。

    98 引用 • 903 回帖 • 1 关注
  • 反馈

    Communication channel for makers and users.

    120 引用 • 906 回帖 • 280 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 2 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 635 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖 • 1 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 464 关注
  • danl
    173 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    91 引用 • 59 回帖 • 2 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 381 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖 • 1 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    134 引用 • 1127 回帖 • 109 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 729 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    10 引用 • 15 回帖 • 6 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    125 引用 • 74 回帖
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1443 引用 • 10082 回帖 • 497 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 7 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 2 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    36 引用 • 200 回帖 • 32 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    693 引用 • 537 回帖
  • Follow
    4 引用 • 12 回帖 • 1 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    190 引用 • 1349 回帖 • 1 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    240 引用 • 224 回帖 • 1 关注