Linux性能优化2.1 CPU性能统计信息

摘要

性能工具:系统CPU

本章概述了系统级的Linux性能工具。这些工具是你追踪性能问题时的第一道防线。它们能展示整个系统的性能情况和哪些部分表现不好。本章将讨论这些工具可以测量的统计信息,以及如何使用各种工具收集这些统计结果。阅读本章后,你将能够:

理解系统级性能的基本指标,包括CPU的使用情况。

明白哪些工具可以检索这些系统级性能指标。


2.1 CPU性能统计信息


每一种系统级Linux性能工具都提供了不同的方式来提取相似的统计结果。虽然没有工具能显示全部的信息,但是有些工具显示的是相同的统计信息。为了不多次(每种工具一次)解释统计信息的含义,我们在描述所有工具之前对这些信息进行一次性说明。

2.1.1 运行队列统计

在Linux中,一个进程要么是可运行的,要么是阻塞的(正在等待一个事件的完成)。阻塞进程可能在等待的是从I/O设备来的数据,或者是系统调用的结果。如果进程是可运行的,那就意味着它要和其他也是可运行的进程竞争CPU时间。一个可运行的进程不一定会使用CPU,但是当Linux调度器决定下一个要运行的进程时,它会从可运行进程队列中挑选。如果进程是可运行的,同时又在等待使用处理器,这些进程就构成了运行队列。运行队列越长,处于等待状态的进程就越多。

性能工具通常会给出可运行的进程个数和等待I/O的阻塞进程个数。另一种常见的系统统计是平均负载。系统的负载是指正在运行和可运行的进程总数。比如,如果正在运行的进程为两个,而可运行的进程为三个,那么系统负载就是5。平均负载是给定时间内的负载量。一般情况下,取平均负载的时间为1分钟、5分钟和15分钟。这能让你观察到负载是如何随时间变化的。

2.1.2 上下文切换

大部分现代处理器一次只能运行一个进程或线程。虽然有些处理器(比如超线程处理器)实际上可以同时运行多个进程,但是Linux会把它们看作多个单线程处理器。如果要制造出给定单处理器同时运行多个任务的假象,Linux内核就要不断地在不同的进程间切换。这种不同进程间的切换称为上下文切换,因为当其发生时,CPU要保存旧进程的所有上下文信息,并取出新进程的所有上下文信息。上下文中包含了Linux跟踪新进程的大量信息,其中包括:进程正在执行的指令,分配给进程的内存,进程打开的文件等。这些上下文切换涉及大量信息的移动,因此,上下文切换的开销可以是相当大的。尽量减少上下文切换的次数是个好主意。

要避免上下文切换,重要的一点是了解它们是如何发生的。首先,上下文切换可以是内核调度的结果。为了保证公平地给每个进程分配处理器时间,内核周期性地中断正在运行的进程,在适当的情况下,内核调度器会决定开始另一个进程,而不是让当前进程继续执行。每次这种周期性中断或定时发生时,你的系统都可能进行上下文切换。每秒定时中断的次数与架构和内核版本有关。一个检查中断频率的简单方法是用/proc/interrupts文件,它可以确定已知时长内发生的中断次数。如清单2.1所示。

清单2.1

 

在清单2.1中,我们要求内核给出定时器启动的次数,等待10秒后,再次请求。这就是说,在这台机器上定时器启动频率为(24 070 093-24 060 043)中断/(10秒)或者约1000次中断/秒。如果你的上下文切换明显多于定时器中断,那么这些切换极有可能是由I/O请求或其他长时间运行的系统调用(如休眠)造成的。当应用请求的操作不能立即完成时,内核启动该操作,保存请求进程,并尝试切换到另一个已就绪进程。这能让处理器尽量保持忙状态。

2.1.3 中断

此外,处理器还周期性地从硬件设备接收中断。当设备有事件需要内核处理时,它通常就会触发这些中断。比如,如果磁盘控制器刚刚完成从驱动器取数据块的操作,并准备好提供给内核,那么磁盘控制器就会触发一个中断。对内核收到的每个中断,如果已经有相应的已注册的中断处理程序,就运行该程序,否则将忽略这个中断。这些中断处理程序在系统中具有很高的运行优先级,并且通常执行速度也很快。有时,中断处理程序有工作要做,但是又不需要高优先级,因此它可以启动“下半部”(bottom half),也就是所谓的软中断处理程序。如果有很多中断,内核会花大量的时间服务这些中断。查看/proc/interrupts文件可以显示出哪些CPU上触发了哪些中断。

2.1.4 CPU使用率

CPU使用率是个简单的概念。在任何给定的时间,CPU可以执行以下七件事情中的一个:

(1)CPU可以是空闲的,这意味着处理器实际上没有做任何工作,并且等待有任务可以执行。

(2)CPU可以运行用户代码,即指定的“用户”时间。

(3)CPU可以执行Linux内核中的应用程序代码,这就是“系统”时间。

(4)CPU可以执行“比较友好”的或者优先级被设置为低于一般进程的用户代码。

(5)CPU可以处于iowait状态,即系统正在等待I/O(如磁盘或网络)完成。

(6)CPU可以处于irq状态,即它正在用高优先级代码处理硬件中断。

(7)CPU可以处于softirq模式,即系统正在执行同样由中断触发的内核代码,只不过其运行于较低优先级(下半部代码)。

此情景出现的条件为:发生设备中断时,而内核在将其移交给用户空间之前必须对其进行一些处理(比如,处理网络包)。

大多数性能工具将这些数值表示为占CPU总时间的百分比。这些时间的范围从0%到100%,但全部三项加起来等于100%。一个具有高“系统”百分比的系统表明其大部分时间都消耗在了内核上。像oprofile一样的工具可以帮助确定时间都消耗在了哪里。具有高“用户”时间的系统则将其大部分时间都用来运行应用程序。下一章展示在上述情况下,如何用性能工具追踪问题。如果系统在应该工作的时候花费了大量的时间处于iowait状态,那它很可能在等待来自设备的I/O。导致速度变慢的原因可能是磁盘、网卡或其他设备。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring + hibernate + JPA 配置

最近对hibernate的JPA实现比较感兴趣&#xff0c;在此记录下配置方法&#xff0c;备查。先上maven依赖包配置&#xff0c;这里使用的是spring3.1.2和hibernate3.6.0<dependencies> <dependency><groupId>org.hibernate</groupId><artifactId…

C语言之sprintf使用总结

1、问题 在open ssl 里面输出16进制的随机数 uint8_t *client NULL;client ssl->s3->client_randomfor (int i 0; i < 32; i){printf("client_random is %02x\n", client[i]);} 但是这样输出都是一个一个的打印&#xff0c;我需要连接在一起的字符串 2…

CSS3弹性伸缩布局(一)——box布局

CSS3弹性伸缩布局简介 2009年&#xff0c;W3C提出了一种崭新的方案----Flex布局&#xff08;即弹性伸缩布局&#xff09;&#xff0c;它可以简便、完整、响应式地实现各种页面布局&#xff0c;包括一直让人很头疼的垂直水平居中也变得很简单地就迎刃而解了。但是这个布局方式还…

Avalonia跨平台入门第十五篇之ListBox聊天窗口

在前面分享的几篇中咱已经玩耍了Popup、ListBox多选、Grid动态分、RadioButton模板、控件的拖放效果、控件的置顶和置底、控件的锁定、自定义Window样式、动画效果、Expander控件、ListBox折叠列表;今天趁着大周末的时间接着去摸索基于ListBox的聊天窗口的效果,最终实现的效果如…

《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.9 打包和混合纹理

本节书摘来自华章出版社《Unity着色器和屏幕特效开发秘笈&#xff08;原书第2版&#xff09;》一书中的第2章&#xff0c;第2.9节&#xff0c;作者 [英]艾伦朱科尼&#xff08;Alan Zucconi&#xff09; [美]肯尼斯拉默斯&#xff08;Kenneth Lammers&#xff09;&#xff0c;更…

云计算及应用课程知识整理

文章目录一、云计算云计算概念云计算的服务类型云计算技术体系结构的层次及其功能为什么云计算成本低&#xff1f;二、GFS分布式的文件系统设计需要考虑哪些问题&#xff1f;GFS架构GFS容错机制三、分布式数据处理MapReducemapReduce概念MapReduce适合什么类型数据&#xff1f;…

LeetCode之Rotate Array

1、题目 Rotate an array of n elements to the right by k steps. For example, with n 7 and k 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4]. Note: Try to come up as many solutions as you can, there are at least 3 different ways to solve this p…

Android loading进度条使用简单总结

在这里&#xff0c;总结一下loading进度条的使用简单总结一下。 一、说起进度条&#xff0c;必须说说条形进度条&#xff0c;经常都会使用到嘛&#xff0c;特别是下载文件进度等等&#xff0c;还有像腾讯QQ安装进度条一样&#xff0c;有个进度总给人良好的用户体验。 先来找图看…

.NET6之MiniAPI(二十二):HttpClient

说明&#xff1a;本篇不是说明HttpClient怎么使用&#xff0c;而以分享在asp.net core mini api框架下&#xff0c;HttpClient的引入和使用方式。我们在业务开发中&#xff0c;免不了调用三方的服务&#xff0c;这时就会用到HttpClient&#xff0c;在早期的asp.net core框架中&…

《超越需求:敏捷思维模式下的分析》—第1章 1.1节简介

本节书摘来自异步社区《超越需求&#xff1a;敏捷思维模式下的分析》一书中的第1章&#xff0c;第1.1节简介&#xff0c;作者【美】Kent J. McDonald&#xff08;肯特 J. 麦克唐纳&#xff09;&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 第一部分 理念…

sublime php语法检查

安装sublimelinter 安装sublimelinter-php 设置sublimelinter 进入SublimeLinter文件夹改动 SublimeLinter.sublime-settings文件 设置php文件夹

使用python获取焦点窗口的进程名称

我正在尝试使用python获取当前焦点窗口的进程名称。现在&#xff0c;我正在与此&#xff1a; import pygetwindow as gw print(gw.getActiveWindow().title)问题在于&#xff0c;这只会显示活动窗口的名称&#xff0c;实际上并没有太大帮助&#xff0c;因为有时应用程序的标题…

Android之jni编译出现no matching function for call to ‘_JNIEnv::GetJava(JNIEnv* , Java VM**)‘解决办法)‘

1、问题 jni编译出现这个错误 no matching function for call to _JNIEnv::GetJava(JNIEnv* &, Java VM**) 2、原因 自己写的 JObject obj NULL; &#xff08;*env&#xff09;->GetObjectClass(env, obj); 这个是在C文件里面这样写&#xff0c;但是cpp文件里面就…

POJ 2240 ZOJ 1082 Arbitrage 最短路,c++ stl pass g++ tle 难度:0

http://poj.org/problem?id2240 用log化乘法为加法找正圈 c 110ms,gtle #include <string> #include <map> #include <iostream> #include <cmath> #include <cstring> #include <queue> using namespace std; const int maxn 50; bool …

lv13 环境搭建SD卡启动

一、制作SD卡启动盘 1.1 方法1&#xff1a;在Linux下制作 一、准备好烧录脚本 cd ~/fs4412 ​ unzip sdfuse_q.zip ​ cd sdfuse_q ​ chmod x *.sh 二、将SD卡插入USB读卡器&#xff0c;并连接到虚拟机 或者 一般识别的sd卡会在dev目录下显示sdb 三、烧录 cp ../u-boot-f…

如何使用c#编写单片机程序

因为个人喜爱想研究单片机&#xff0c;但是不太会c&#xff0c;然后再找资料研究有没有其他的方法发现国外的c# nanoframework 框架可以编写单片机程序&#xff0c;本文我将会用自己踩过的坑来总结一些c#编写单片机的一些经验&#xff0c;希望帮到热爱c#的xd 首先第一步我们需要…

机器学习与数据挖掘——第二章 数据与数据预处理

一、关于数据 什么是数据&#xff1f; 数据是数据对象的集合及其属性 属性的类型 标称标度 nominal scale 标称属性的值是一些符号或实物的名称&#xff0c;每个值代表某种类别、编码或状态&#xff0c;所以标称属性又被看做是分类型的属性&#xff08;categorical&#xff…

《 线性代数及其应用 (原书第4版)》——1.2 行化简与阶梯形矩阵

本节书摘来自华章出版社《 线性代数及其应用 &#xff08;原书第4版&#xff09;》一书中的第1章&#xff0c;第1.2节&#xff0c;作者:&#xff08;美&#xff09;戴维C. 雷&#xff08;David C. Lay&#xff09;马里兰大学帕克学院 著刘深泉 张万芹 陈玉珍 包乐娥 陆 博 译&a…

Android之jni解决JNIEnv跨线程问题

1、问题 JNIEnv是一个线程相关的变量 JNIEnv 对于每个 thread 而言是唯一的 JNIEnv *env指针不可以为多个线程共用 2、解决办法 java虚拟机的JavaVM指针是整个jvm公用的,我们可以用JavaVM来得到当前线程的JNIEnv指针,可以使用javaAttachThread保证取得当前线程的Jni环境…

SQL Server 提高创建索引速度的 2 个方法

方法 1、 使用tempdb来提速 create index index_name on table_name (column_list) with(sort_in_tempdb on); 方法 2、 使用多线程为来提速 create index index_name on table_name (column_list) with(maxdop 4); maxdop ( max dgree of parallelism)这下记到了吧 转载于:h…