从系统的角度分析影响程序执行性能的因素
从系统的角度分析影响程序执行性能的因素
1、请您根据本课程所学内容总结梳理出一个精简的Linux系统概念模型,最大程度统摄整顿本课程及相关的知识信息,模型应该是逻辑上可以运转的、自洽的,并举例某一两个具体例子(比如读写文件、分配内存、使用I/O驱动某个硬件等)纳入模型中验证模型。
2、然后将一个应用程序放入该系统模型中系统性的梳理影响应用程序性能表现的因素,并说明原因。
3、产出要求是发表一篇博客文章,长度不限,1要简略,2是重点,只谈自己的思考和梳理,严禁引用任何资料(包括本课程的资料)造成文章虚长。
1.Linux系统概念模型
对该模型的解读:
这个模型是从上到下的,上面为用户空间的部分,下面为内核空间的部分。glibc库函数本质上是对系统调用的简单封装,可以通过调用库函数来使用系统调用。
进程管理包括了多个方面,如进程的描述和创建和进程的切换,进程的切换又涉及到上课所讲的进程上下文切换和中断上下文切换。
其中中断这个概念在整个系统中都极为常见,系统调用通常涉及用户态到内核态的切换,这就涉及到了中断。中断还与时钟相关,用于定时测量。
设备驱动是硬件与软件之间的桥梁,更接近底层,更接近硬件。
例子:读/写文件
读文件:(加粗字体为上述模型中模块名)
- 应用程序调用库函数向内核发起读文件请求
- 内核通过文件描述符定位到虚拟文件系统的打开文件表表项
- 调用该文件可用的系统调用函数sys_read()
- sys_read()函数通过文件表表项链接到目录项模块,根据传入的文件路径,在目录项模块中检索,找到该文件的inode;并在inode中,通过文件内容偏移量计算出要读取的页;通过inode找到文件对应的address_space(这一步发生在虚拟文件系统中)
- 在address_space中访问该文件的页缓存树,查找对应的页缓存结点,如果页缓存命中,那么直接返回文件内容; 如果页缓存缺失,那么产生一个页缺失异常(缺页中断),创建一个页缓存页,同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页,重新查找页缓存
写文件:(与读文件操作的前四步都非常接近)
- 应用程序调用库函数向内核发起读文件请求
- 内核通过文件描述符定位到虚拟文件系统的打开文件表表项
- 调用该文件可用的系统调用函数sys_read()
- sys_read()函数通过文件表表项链接到目录项模块,根据传入的文件路径,在目录项模块中检索,找到该文件的inode;并在inode中,通过文件内容偏移量计算出要读取的页;通过inode找到文件对应的address_space(这一步发生在虚拟文件系统中)
- 在address_space中查询对应页的页缓存是否存在,如果页缓存命中,直接把文件内容修改更新在页缓存的页中;如果页缓存缺失,那么产生一个页缺失异常,创建一个页缓存页,同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页。一个页缓存中的页如果被修改,那么会被标记成脏页,脏页需要写回到磁盘中的文件块。(这一步涉及设备驱动程序和硬件)
2.影响应用程序性能表现的因素
采用性能分析工具perf进行分析。
程序:
int array[10000][10000];
int main() {
for(int i = 0; i < 10000; ++i) {
for(int j = 0; j < 10000; ++j) {
++array[j][i];
}
}
return 0;
}
该程序涉及上述系统中的:应用程序、内存管理
perf stat --repeat 5 -e cache-misses,cache-references,instructions,cycles ./perfStatTest
使用上述命令对程序进行时间采样分析。
- cache-misses对应cache利用率的情况,如果该值过高,代表cache利用率不好
- cache-references代表cache命中次数
- instructions代表机器指令数目
- cycles代表时钟周期数
(还可以通过指定命令参数获取其他感兴趣的事件,如:进程切换次数、CPU利用率、CPU迁移数等。)
在运行上述命令后:
出现了不支持的情况,网上一查,需要设置以下选项:
但设置好了之后发现无法启动虚拟机
于是只能放弃进一步的探索。
结论:根据上述实验,可得知,影响应用程序性能表现的因素有:cache命中率、CPU利用率、进程切换次数等。改变读取数组的方式,会影响cache命中率,从而影响整体的效率。
总的来说可以分为四个方面:CPU、内存、IO、网络,CPU方面的因素包括CPU频率、CPU数量等;内存方面的因素包括内存大小、内存频率等;IO方面的因素包括IO请求数量等;网络带宽也影响着涉及网络的应用程序的运行效率。