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

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

    3168 引用 • 8207 回帖
  • 工具

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

    275 引用 • 682 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Bootstrap

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

    18 引用 • 33 回帖 • 684 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 3 关注
  • FreeMarker

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

    23 引用 • 20 回帖 • 428 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    116 引用 • 99 回帖 • 267 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 407 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 449 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 610 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 624 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 462 关注
  • 微服务

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

    96 引用 • 155 回帖
  • 安装

    你若安好,便是晴天。

    128 引用 • 1184 回帖
  • JavaScript

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

    710 引用 • 1173 回帖 • 171 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 383 回帖 • 4 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 181 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 604 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    7 引用 • 26 回帖 • 3 关注
  • 禅道

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

    5 引用 • 15 回帖 • 221 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 545 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    76 引用 • 37 回帖
  • Sillot

    Sillot (汐洛)孵化自思源笔记,致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点
    Github 地址:https://github.com/Hi-Windom/Sillot

    16 引用 • 6 回帖 • 28 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 352 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 56 关注
  • 知乎

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

    10 引用 • 66 回帖