在Linux里,一个进程,对于线程来说要不在运行,要不在阻塞。
每个CPU都会维持一个运行队列,理想情况下,调度器会不断让队列中的进程运行。进程不是处在sleep状态就是run able状态。CPU只会运行处于runnable状态的线程,不是线程越多CPU就越忙,如果CPU过载,就会出现调度器跟不上系统的要求,导致可运行的进程会填满队列。队列愈大,程序执行时间就愈长。
runnable(可运行)状态,意味着他正在和其他数据运行状态的进程竞争CPU的时间,谁的优先级越高CPU给他的时间就稍微多点。怎么知道优先级呢,在时间上会有点区别。
运行状态的进程,不一定正在使用CPU,如5个在排队。同一时刻可能只有一个人在用这个资源。Linux调度器会决定去运行哪个进程。他会从运行状态的进程列表里面去提取他要运行的哪些进程。
队列:当这些进程是运行状态,等待CPU处理的任务数就叫运行队列。任务越多队列越长,运行队列越长表示我的压力机就越大。
队列多少比较合适呢:在任何一个时刻CPU的一个核同一时刻只能处理一个线程。如果CPU有4个核,同一时刻处理4个任务,这个队列最好是4.。队列最好等于内核个数,最好不要超过你内核个数的3倍。
队列包含正在得到CPU运行的那个线程。
# uptime
09:51:12 up 324 days, 23:01, 1 user, load average: 0.32, 0.30, 0.32
"load average" 用来表示运行队列,用top 命令我们可以看到CPU一分钟,5分钟和15分钟内的运行队列的大小。这个值越大表明系统负荷越大。
# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 565760 695564 24525440 0 0 0 24 0 0 2 1 96 0 0
r表示运行队列的大小,r的参考值是:小于4,队列大于4时,表明系统的cpu或内存可能有问题,如果r经常大于4,且id经常少于40,表示cpu的负荷很重。当队列变长时,队列中进程在等待cpu调度执行时所花的时间会变长。
id参考值: 大于40,如果r经常大于4,且id经常小于40,表示cpu的负荷很重。
wa 参考值:小于25%,超过25%的wa的值可以表示磁盘子系统可能没有被正确平衡,也可能是磁盘密集工作负载的结果,系统的磁盘或其它I/o可能有问题,可以通过iostat/SAR –C
命令进一步分解分析。
top - 09:54:46 up 416 days, 21:50, 1 user, load average: 0.32, 0.27, 0.32
Tasks: 288 total, 1 running, 287 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.3 us, 2.3 sy, 0.0 ni, 95.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 64757900 total, 1637052 free, 47836680 used, 15284168 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 16345440 avail Mem
对于每一个CPU来说运行队列不要超过3,例如,如果是双核CPU就不要超过6;
如果CPU在满负荷运行,应该符合下列分布,
a) User Time:65%~70%, us过大,说明有用户进程占用很多cpu时间,需要进一步的分析其它软硬件因素。
b) System Time:30%~35%,sy过大,说明系统管理方面花了很多时间,说明该系统中某个子系统产生了瓶颈,需要进一步分析其它软硬件因素。
c) User Time+System Time ,合理值范围是 60-85%,如果在一个多用户系统中us+sy时间超过85%,则进程可能要花时间在运行队列中等待,响应时间和业务吞吐量会受损害
d) Idle:0%~5%, CPU完全空闲的百分比
评论区