在操作系统内核上Linux是支持进程抢占的。在内核tick时钟中断时会产生进程中断进而可以对系统资源进行抢占,既然是时钟计时那内核需要工作在一定频率上例如 100HZ、250HZ等等这些都是可 以进行系统级调整的。其实早期的Linux内核工作在100HZ上后来被提升到1000HZ,赫兹越高时钟频率越高解析的精度越高就意味着支持抢占的机会越多进程切换的次数越多经过验证后来赫兹越高性能未必越好后来又下降到100HZ。拿100HZ来说,时钟tick无论是否有进程在工作每秒中必须要执行的系统中断如果cpu处于空闲的状态下依然非常消耗资源大量的cpu在空载,在今天Linux已经完全实现了无时钟tick这能使得cpu在空闲状态能进行深度睡眠
现在的计算机cpu很多都是多核心,cpu为了实现和内存在运行速度上衔接都有自己的缓存一共分为一级缓存,二级缓存,三级缓存
一级缓存分为两种:一级指令缓存I1(instruction)和一级数据缓存(data)D1,一级缓存和二级缓存是cpu独有的三级缓存是共享的
当多颗cpu访问同一段内存的时候(内存只有一个必然成为临界区)一定会引起资源竞争,而一个cpu要完成一次内存数据访问至少需要3个cpu时钟周期,第一个时钟周期想内存传输一个寻址要求内存控制器返回一个地址空间;第二个时钟周期根据返回的地址指令在内存中找到对应的内存地址;第三个时钟周期完成读或者写的操作
所以说当cpu直接访问三级内缓存会比主存要快的多并且也能大大降低系统资源的争用。
这里来举例2颗cpu所带来的系统性能,cpu1有自己的专有一段内存,cpu2也有自己的专有一段内存而内核可能会将数据装载到任何一段内存中,如果现在有200个进程cpu1分配了100个cpu2分配了100个,而cpu1执行速度要快先执行完了90个那么cpu1还剩下10个,cpu2执行慢只执行了10个还剩下90个,那么这时候内核会重新Rebalancing重新调度平衡将cpu2剩下的90个分出来40个给cpu1此时两颗cpu都是50个而原本cpu2的进程被分给了cpu1的进程数据还在cpu2的内存段中此时cpu1将要访问cpu2内存段中的数据,这样一来cpu1访问cpu2的内存段数据距离要远很多至少要6个时钟周期在非一致性内存架构中就存在这中情况(Non-uniform Memory Architecture)这种情况就可以将进程绑定到特定的cpu上从而避免交叉内存访问
希望特定的进程在某颗cpu上一直处于运行状态就需要将cpu和进程绑定是一种系统调优的重要手段之一。如何知道进程上下文切换以及cpu、内存使用率?我们需要借助一些工具
查看cpu平均负载
top
sar -q
uptime
vmstat
查看cpu平均使用率
top
mpstat
sar -p
iostat
dstat—很强大的命令
进程和cpu绑定可自行查资料都是一些相关命令
