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

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

    3195 引用 • 8215 回帖
  • 工具

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

    297 引用 • 755 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    245 引用 • 1338 回帖 • 1 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 639 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 318 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    431 引用 • 1250 回帖 • 599 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 677 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 385 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    16 引用 • 236 回帖 • 268 关注
  • Bootstrap

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

    18 引用 • 33 回帖 • 651 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    143 引用 • 442 回帖
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 19 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖 • 1 关注
  • Electron

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

    15 引用 • 136 回帖 • 2 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1395 回帖
  • 学习

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

    172 引用 • 516 回帖 • 1 关注
  • 音乐

    你听到信仰的声音了么?

    62 引用 • 512 回帖 • 1 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 821 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 646 关注
  • MongoDB

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

    90 引用 • 59 回帖 • 8 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    66 引用 • 114 回帖 • 197 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 6 关注
  • abitmean

    有点意思就行了

    32 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    211 引用 • 358 回帖
  • gRpc
    11 引用 • 9 回帖 • 90 关注