哔前哔言
- 始终践行费曼学习法
- 理解系统知识原理
- 掌握性能分析工具
- 多实践,多思考,多提问
- 仅记录个人的学习记录,欢迎指点纠正
1、CPU上下文
1.1、定义
CPU上下文:CPU寄存器和程序计数器
- 寄存器:CPU内置的容量小,但速度极快的内存
- 程序计数器:用来存储正在执行指令的位置或即将执行的下一条指令位置
CPU上下文切换:保存上一个任务运行的寄存器和计数器信息切换到加载下一个任务的寄存器和计数器的过程
CPU上下文切换,是保证系统工作的核心功能之一
1.2、分类
1.2.1、进程上下文切换
进程既可以在用户空间运行(进程用户态),也可以在内核空间运行(进程内核态)
用户态到内核态的转变,需要通过系统调用完成
一次系统调用过程,两次CPU上下文切换:
- 先保存原来用户态的指令位置,更新内核态指令的新位置,跳转到内核态运行内核任务(用户态-->内核态)
- 系统调用结束后,恢复寄存器保存的用户态,跳转回用户空间,继续运行进程 (内核态→用户态)
区别
序号 | 进程上下文切换 | 系统调用 |
---|---|---|
1 | - 从一个进程切换到另一个进程运行 | - 同一个进程在运行【特权模式切换】 - 系统调用过程中会发生CPU的上下文切换 |
2 | - 需保存 虚拟内存,栈,全局变量 等用户空间的资源,- 需保存内核堆栈,寄存器等内核空间的状态 | - 需保存 虚拟内存,栈,全局变量 等用户空间的资源 |
场景
- 以时间片段划分进程,时间片段耗尽,就会发生系统调度,切换到另一在等待的进程
- 系统资源不足时,需等待资源满足后才能运行,就会挂起当前进程,然后系统调度其他进程运行
- sleep函数使进程主动挂起,然后系统调度其他进程运行
- 当优先级高的进程运行时,当前进程会被挂起,先执行优先级高的进程
- 发生硬件中断时,当前进程中断挂起,然后执行中断程序
1.2.2、线程上下文切换
线程是调度的基本单位,进程是资源拥有的基本单位。所以,内核任务调度时,是在调度线程,进程是提供虚拟内存,全局变量等资源。
线程上下文切换 | 同一进程内线程 | 不同进程间线程 |
---|---|---|
前提 | 进程只有一个线程,则进程等于线程 虚拟内存和全局变量资源共享 | 资源不共享 |
切换过程 | 只需保存线程私有的数据,寄存器等不共享资源 | 保存线程私有的数据 保存进程的虚拟内存和全局变量等资源 |
1.2.3、中断上下文切换
- 中断优先级会打断进程的正常调度和执行,然后去处理中断处理程序
- 对于同一个CPU来说,中断处理比进程拥有更高的优先级
2、分析CPU上下文
过多的上下文切换,会影响系统的整体性能。
2.1、分析标准
2.1.1、vmstat 系统性能分析工具,输出系统总体的上下文切换情况。
- cs 每秒上下文切换次数
- in 每秒中断的次数
- r 就绪队列长度,也就是正在运行和等待CPU的进程次数
- b 处于不可中断状态进程数
2.1.2、pidstat -w 查看每个进程上下文切换的情况
- cswch/s 每秒自愿上下文切换的次数【进程无法获取所需资源导致上下文切换】
- nvcswch/s 每秒非资源上下文切换次数【进程由于时间片已到等原因,被系统强制调度而发生山下文切换】
2.2、实践
#10个线程运行5分钟的基准测试,模拟多线程切换问题
sysbench --threads=10 --max-time=300 threads run
#每隔1秒输出1组数据
vmstat1
# 每隔``1``秒 输出``1``组数据
# -w 参数表示输出进程切换指标,-u 参数则表示输出CPU使用指标
#-wt 参数表示输出线程的上下文切换指标
pidstat -wt``1
# -d 高亮显示变化的区域
watch -d cat /proc/interrupts
疑问:没有看到重调度??
看不见RES是因为窗体开的太小,RES在最下面
3、总结
主要学习了CPU上下文,上下文分类,各分类的上下文切换的工作原理。
使用工具
- sysbench 模拟多线程工作,
- vmstat查看系统总体上下文切换次数【cs】,中断次数【in】,就绪队列【r】,不可中断进程数【b】
- pidstat -wt 查看进程的每秒资源上下文切换次数【cswch】,每秒非资源上下文切换次数【nvcswch】
- 查看了中断文件/proc/interrupts中分析
4、附录
1、工具
1.1、vmstat工具,系统性能分析工具,用来分析系统内存使用情况,分析CPU上下文切换和中断的次数
安装sysbench ,centos
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
sudo yum -y install sysbench
1.2、sysbench工具,多线程基准测试工具,用来评估不同系统参数下的数据库负载情况
#10个线程运行5分钟的基准测试,模拟多线程切换问题
sysbench --threads=10 --max-time=300 threads run
2、引用
- 《极客时间》Linux性能优化实践
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。