操作系统
2023-06-09 13:54:45 6 举报
AI智能生成
设计模式
作者其他创作
大纲/内容
进程管理
同步与通信
进程同步
临界区
同步与互斥
信号量
生产者消费者问题
哲学家就餐问题
管程
生产者消费者问题
进程通信
管道
具名管道
消息队列
信号量
共享存储
套接字
死锁问题
必要条件
处理方法
鸵鸟策略
死锁检测与恢复
死锁预防
死锁避免
进程调度
上下文(Context)
进程上下文切换
内核态与用户态
切换流程
与系统调用的区别
切换成本
TLB
切换时机
进程执行终了
进程被公平分配时间片
系统资源不足,进程挂起
进程 sleep 主动挂起
高优先级进程抢先执行
线程上下文切换
中断上下文切换
内核态工作
更高的优先级
调度算法
批处理系统
先来先服务
短作业优先
最短剩余时间优先
交互式系统
时间片轮转
优先级调度
多级反馈队列
实时系统
中断(Interrupt)
硬中断
软中断
中断分类
外中断
陷入
异常
异常进程
不可中断进程(D)
僵尸进程(Z)
处理方法
孤儿进程
CPU 管理
平均负载(Load Average)
进程状态
可运行:正在使用或等待 CPU
不可中断:处于内核态关键流程中、不可打断
使用率(Usage)
与平均负载的关系
节拍率
缓存命中率
性能优化
系统优化
CPU 绑定:可提高 CPU 缓存的命中率,减少跨 CPU 调度带来的上下文切换问题
CPU 独占:进一步将 CPU 分组,通过 CPU 亲和性机制为其分配进程
适当降低非核心应用的优先级,增高核心应用的优先级,可确保核心应用得到优先处理
使用 Linux cgroups 设置进程 CPU 使用上限,可防止由于某个应用自身的问题而耗尽系统资源
支持 NUMA 的处理器会被划分为多个 node,每个 node 都有自己的本地内存空间
开启 irqbalance 服务或者配置 smp_affinity,把中断处理过程自动负载均衡到多个 CPU 上
用户可打开文件的最大数目 ulimit -n 和 /etc/security/limits.conf nofile
用户可开启进程/线程的最大数目 ulimit -u 和 /etc/security/limits.conf noproc
监控方法
iowait 分析
平均负载
压力测试
使用率
统计信息
上下文切换
问题排查
上下文切换过多
自愿切换过多:进程在等待资源,可能发生 I/O 问题
非自愿切换过多:进程在被强制调度、争抢 CPU,CPU 成为瓶颈
中断次数变多:说明 CPU 被中断处理程序占用,应分析中断类型
使用率过高
用户 CPU 和 Nice CPU 高:用户态进程占用了较多 CPU,着重排查进程性能问题
系统 CPU 高:内核态占用了较多 CPU,着重排查内核线程或系统调用的性能问题
I/O 等待 CPU 高:等待 I/O 的时间比较长,着排查系统存储是否出现 I/O 问题
软中断和硬中断高:软中断或硬中断处理程序占用较多 CPU,着重排查内核中断服务程序
不断重启的进程:同名进程 pid 不断改变
软中断过多
系统调用
进程管理:fork、exit、wait
进程通信:pipe、shmget、mmap
文件操作:open、read、write
设备操作:ioctl、read、write
信息维护:getpid、alarm、sleep
权限安全:chmod、umask、chown
文件系统
索引节点和目录项
关于删除文件
文件系统与磁盘
I/O 方式
文件 I/O:I/O 请求首先经过文件系统,由文件系统与磁盘交互
块设备 I/O:跳过文件系统、直接与磁盘交互,即裸 I/O
读写原理
虚拟文件系统(VFS)
磁盘文件系统
内存文件系统
网络文件系统
Page Cache
I/O 方式
直接与非直接 I/O
直接 I/O:跳过操作系统页缓存,直接与文件系统交互访问文件
非直接 I/O:文件读写时经过系统页缓存,再由内核或额外的系统调用真正写入磁盘
零拷贝(Zero Copy)
实现方式
mmap+write:利用虚拟内存映射到用户空间
sendfile:直接从磁盘读取到内核、发送到网卡
无需关心 Socket 缓冲区大小
利用 Page Cache
无法对数据进行预处理
传输大文件效率低
阻塞与非阻塞 I/O
阻塞 I/O:执行 I/O 操作后如没有获得响应就会阻塞当前线程,不能执行其他任务
非阻塞 I/O:执行 I/O 操作后不会阻塞当前的线程,随后再通过轮询或者事件通知的形式获取调用结果
同步与异步 I/O
同步 I/O:发起 I/O 操作后要等到整个 I/O 完成后,才能获得 I/O 响应
异步 I/O:发起 I/O 操作后不等待完成,I/O 完成后响应由内核以事件通知应用程序
缓冲与非缓冲 I/O
缓冲 I/O:利用标准库缓存加速文件访问,标准库内部再通过系统调度访问文件
非缓冲 I/O:直接通过系统调用来访问文件,不经过标准库缓存
性能优化
磁盘
性能指标
监控方法
优化方向
优化文件访问:使用页缓存、索引节点缓存、目录项缓存等减少对下层块设备的直接调用
优化块设备访问:使用缓冲区来缓存块设备的数据
文件系统
监控方法
优化方向
选择合适的文件系统
优化文件系统配置选项
优化缓存
优化 pdflush 脏页的刷新频率
优化脏页限额
优化内核回收目录项缓存和索引节点缓存的倾向
内存管理
虚拟内存
内存映射
缺页异常
转移后备缓冲区(TLB)
内存布局
只读段:包括代码和常量等
数据段:包括全局变量等
堆:包括动态分配的内存,从低地址开始向上增长
文件映射段:动态分配,包括动态库、共享内存等,从高地址开始向下增长
栈:包括局部变量,函数调用上下文等(大小一般固定 8MB)
内存分配
小块内存:brk
大块内存:mmap
内存碎片
内部碎片:slab 分配器
外部碎片:伙伴系统
内存泄漏
内存回收
回收时机
直接回收
定期回收
回收策略
手动回收
free() 或 unmap()
自动回收
基于淘汰算法:LRU、Second Chance 等
不常用的内存通过交换分换出到磁盘
基于 zproject 的内存压缩
基于 oom_score 为进程评分,高分 OOM 杀死
交换空间
文件页(File-backed Page):经系统释放后可回收的内存,包括缓存和缓冲区
匿名页(Anonymous Page):诸如应用程序动态分配的堆内存,不能被直接回收
Swap 原理
换入:把进程暂时不用的内存数据存储到磁盘中,并释放内存
换出:在进程再次访问这些内存时,从磁盘读到内存
NUMA 架构
分页系统地址映射
页面置换算法
最佳(OPT)
最近最久未使用(LRU)
最近未使用(NRU)
先进先出(FIFO)
第二次机会
时钟(Clock)
分段管理
段页式
与分页比较
Buffer 与 Cache
Buffer:磁盘数据缓存
Cache:文件系统数据缓存
SRealaimable
性能优化
系统优化
禁止 Swap,如果必须开启 Swap 则降低 swappiness 的值,减少内存回收时 Swap 的使用倾向
减少内存的动态分配,比如使用内存池、大页(HugePage)等
尽量使用缓存和缓冲区来访问数据
使用 cgroups 等方式限制进程内存使用情况
通过 /proc/pid/oom_adj,调整核心应用的 oom_score
缓存优化
命中分析
监控方法
监控方法
Swap
内存泄漏
读写分析
写操作
读操作
设备管理
磁盘(Disk)
存储介质
机械硬盘(Hard Disk Driver,HDD)
盘面(Platter)
磁道(Track)
扇区(Track Sector)
磁头(Head)
制动手臂(Actuator arm)
主轴(Spindle)
固态硬盘(Solid State Disk,SSD)
接口
架构
I/O 栈
文件系统层
通用块层
I/O 调度算法
NONE
NOOP
CFQ
Deadline
设备层
调度算法
先来先服务
最短寻道时间优先
电梯算法
虚拟化
0 条评论
下一页