从系统的角度分析影响程序执行性能的因素
实验总结分析报告:从系统的角度分析影响程序执行性能的因素
1、请您根据本课程所学内容总结梳理出一个精简的Linux系统概念模型,最大程度统摄整顿本课程及相关的知识信息,模型应该是逻辑上可以运转的、自洽的,并举例某一两个具体例子(比如读写文件、分配内存、使用I/O驱动某个硬件等)纳入模型中验证模型。
2、然后将一个应用程序放入该系统模型中系统性的梳理影响应用程序性能表现的因素,并说明原因。
3、产出要求是发表一篇博客文章,长度不限,1要简略,2是重点,只谈自己的思考和梳理,严禁引用任何资料(包括本课程的资料)造成文章虚长。
一、Linux系统模型简述
若是根据冯诺依曼计算系体系,则计算机可以笼统分为四个部分,分别是内存、CPU、输入设备、输出设备。Linux系统的最基础部分与之相似,具体操作可以归为进程管理、内存管理、文件系统、设备管理。除此之外还有一些额外的相内容,比如网络、时钟等,也是属于Linux系统模型的一部分。
1、进程管理
进程管理涉及的内容有很多,包括但不限于:
- 进程实体
- 进程控制块
- 进程代码
- 进程操作
- 进程创建
- 进程切换
- 进程调度
- 与Linux内核相关的
- 函数调用
- 系统调用
- 中断、异常、上下文切换
2、内存管理
内存管理在课程中的占比较低,但是由于也是操作系统的重要一环因此也说一说:
- 内存存储结构的三角形结构
- Cache-内存-外存
- 物理内存的分配管理方式
- 连续分配管理
- 非连续分配管理
- 虚拟内存
- 虚拟内存定义
- 请求分页管理方式
- 页面置换算法
- 页面分配策略
3、文件系统
文件系统在Linux中也是一个绕不开的话题,在Linux中文件系统的定义相当广泛,设备文件、管道文件、套接字都被归于文件一类,从而大大简化了Linux中相关内容的管理难度。
- 文件属性以及文件分类
- 文件实体(文件控制块、物理结构)
- 文件操作(创建文件、文件链接等)
- 文件管理系统(目录的逻辑与物理实现
~课程中主要介绍了Linux的两类文件系统
- Ext2文件系统
- 主要由块组构成
- 超级块作为块组的核心,记录了对应分区的相关内容
- 块组描述符存在于块组中,记录对应块组的相关内容
- 目录项、索引节点表记录索引的相关内容
- 相关文件、索引、数据块操作
- VFS虚拟文件系统
- 含义:通过mount(挂载、 安装)将各种不同的文件系统到达根文件系统中
- 位于用户空间与文件系统中间的系统空间内,用来“管理“、”链接“各文件系统与用户空间
- 包括目录项、索引项、文件对象
- 涉及文件读写相关操作
- 主要操作:安装、挂载、卸下文件系统
4、设备管理
操作系统设备繁多,并且在课程内容中并未有过多提及,因此在此也仅仅简单阐述一下设别管理中比较有代表性的设备管理:
- Linux中设备管理流程
- 设备实体(设备类型、体系、分类)
- 设备控制方式
- 设备子系统的层次结构
- 设备驱动文件
- 设备操作(设备注册、分配与回收、其余设备分配技术)
5、举例
以IO驱动某个硬件为例:
以位于 /dev
目录下的设备文件为枢纽,应用程序、操作系统将内容传递到设备文件,设备文件将其传递给设备驱动文件,设备驱动文件再将其传递给底层硬件
一个简单命令的简化数据流程被显示在上图中。从一个终端仿真器发出 cat /etc/resolv.conf
命令,会从磁盘中读取 resolv.conf
文件,磁盘设备驱动程序处理设备的具体功能,例如在硬盘驱动器上定位文件并读取它。数据通过设备文件传递,然后从命令到设备文件,然后到伪终端的设备驱动,然后在终端会话中显示。
当然, cat
命令的输出可以以下面的方式被重定向到一个文件, cat /etc/resolv.conf > /etc/resolv.bak
,这样会创建该文件的备份。在这种情况下, 左侧的数据流量将保持不变,而右边的数据流量将通过 /dev/sda2
设备文件、硬盘设备驱动程序,然后到硬盘驱动器本身。
二、应用程序放入该系统模型中
以最后一个实验为例,以stress工具作为应用程序,寻找影响应用程序性能表现的因素
yum install stress // 安装stress工具
//stress指令介绍
// --cpu 8:8个进程不停的执行sqrt()计算操作
// --io 4:4个进程不同的执行sync()io操作(刷盘)
// --vm 2:2个进程不停的执行malloc()内存申请操作
// --vm-bytes 128M:限制1个执行malloc的进程申请内存大小
stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s
评判性能影响需要一个指标,在此使用平均负载作为该指标:
Load averages 在工业界中是一个很关键的指标,
Linux load averages 是系统负载平均值(system load averages),
它将正在运行的线程(任务)对系统的需求显示为平均运行数和等待线程数。
Linux load averages 可以衡量任务对系统的需求,并且它可能大于系统当前正在处理的数量,
大多数工具将其显示为三个平均值,分别为 1、5 和 15 分钟值。
通过三个不同的指令及实验作为对比
stress –c 1 //模拟单进程高负荷情况
stress –i 1 //模拟IO瓶颈问题,即死循环执行sync刷盘操作
stress –c 32 //执行 32个进程,模拟多进程高负载情况
实验一结果:
实验二结果:
实验三结果:
实验结论:
- 平均负载高有可能是 CPU 密集型进程导致的
- 平均负载高并不一定代表 CPU 使用率高,还有可能是 I/O 更繁忙了
- 当发现负载高的时候,你可以使用 mpstat、pidstat 等工具,辅助分析负载的来源
此外,在该实验外可能影响程序性能的因素可能有:
- 源代码的因素
- 本身代码素质
- 是否频繁使用全局、静态变量
- 动态链接库的相关因素
- 配置文件、资源文件的相关因素
- 系统底层的相关因素
- 底层内层分配器的策略
- 进程调度、线程调度算法
- 是否使用多线程、异步编程等优化算法
- 使用的硬件自身的快慢、好坏问题