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

本贴最后更新于 1716 天前,其中的信息可能已经时移世易
  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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8208 回帖
  • 工具

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

    281 引用 • 716 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 94 关注
  • 倾城之链
    23 引用 • 66 回帖 • 120 关注
  • 996
    13 引用 • 200 回帖 • 6 关注
  • Tomcat

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

    162 引用 • 529 回帖
  • 博客

    记录并分享人生的经历。

    272 引用 • 2386 回帖
  • CodeMirror
    1 引用 • 2 回帖 • 125 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    71 引用 • 1737 回帖 • 1 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 51 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    35 引用 • 35 回帖
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    21 引用 • 58 回帖
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 65 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    713 引用 • 1174 回帖 • 104 关注
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 680 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖 • 19 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 88 回帖
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 5 关注
  • abitmean

    有点意思就行了

    38 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    5 引用 • 62 回帖
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖 • 1 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 1 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 600 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    163 引用 • 473 回帖
  • Firefox

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

    7 引用 • 30 回帖 • 429 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    165 引用 • 407 回帖 • 510 关注