首页 > 系统相关 >谁在切换我们的进程

谁在切换我们的进程

时间:2022-12-04 10:07:27浏览次数:80  
标签:task 50724 Worker swapper idle 切换 进程 我们 21

参考:​​http://blog.yufeng.info/archives/747​

在做Linux服务器的时候经常会需要知道谁在做进程切换,什么原因需要做进程切换。 因为进程切换的代价很高。

那么进程 线程 切换一次 多少时钟周期呢?

切换是发生在什么时候呢??

vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
36 0 0 113682376 19188 828872 0 0 1 10 1 0 1 3 96 0 0
39 0 0 113671784 19188 828996 0 0 0 8 1408386 239442 21 58 21 0 0
42 0 0 113675488 19188 829088 0 0 0 132 1396904 228653 21 59 20 0 0
36 0 0 113673592 19196 830044 0 0 0 48 1377641 240742 21 58 21 0 0
>pidstat -w -t 1
erage: 0 - 90123 0.96 0.00 |__wafd
Average: 0 - 90124 1916.83 76.10 |__Worker 0
Average: 0 - 90125 1548.76 75.53 |__Worker 1
Average: 0 - 90126 2011.85 61.57 |__Worker 2
Average: 0 - 90127 1811.66 68.83 |__Worker 3
Average: 0 - 90128 1873.61 69.60 |__Worker 4
Average: 0 - 90129 2007.46 71.32 |__Worker 5
Average: 0 - 90130 1945.12 65.20 |__Worker 6
Average: 0 - 90131 2047.80 63.86 |__Worker 7
sar -w 1  
proc/s
Total number of tasks created per second.
cswch/s
Total number of context switches per second.
11:19:20 AM proc/s cswch/s
11:19:21 AM 110.28 23468.22
11:19:22 AM 128.85 33910.58
11:19:23 AM 47.52 40733.66
11:19:24 AM 35.85 30972.64
11:19:25 AM 47.62 24951.43
11:19:26 AM 47.52 42950.50

 

谁在切换我们的进程

 

#! /usr/bin/env stap
#
#

global csw_count
global idle_count

probe scheduler.cpu_off {
csw_count[task_prev, task_next]++
idle_count+=idle
}


function fmt_task(task_prev, task_next)
{
return sprintf("%s(%d)->%s(%d)",
task_execname(task_prev),
task_pid(task_prev),
task_execname(task_next),
task_pid(task_next))
}

function print_cswtop () {
printf ("%45s %10s\n", "Context switch", "COUNT")
foreach ([task_prev, task_next] in csw_count- limit 40) {
printf("%45s %10d\n", fmt_task(task_prev, task_next), csw_count[task_prev, task_next])
}
printf("%45s %10d\n", "idle", idle_count)

delete csw_count
delete idle_count
}

probe timer.s(1) {
print_cswtop ()
printf("-----------------\n")
}

 

编译systemtap 然后使用编译好的stap 编译cswcom.stp

对于出现如下的错误:

./install/bin/staprun  ./csw.ko
ERROR: module version mismatch (#1 SMP Thu Nov 3 03:37:37 UTC 2022 vs #1 SMP Sat Sep 24 03:26:50 UTC 2022), release 4.4.131.kylin.x86

处理方式:修改include/generated/compile.h 文件中的时间戳即可

./install/bin/stap  -r /home/xxxx/workspace/v6.0.8.0/src/core/kernel/linux/build/linux-4.4.131/  -m csw  ./cswcom.stp
./install/bin/staprun  ./debugcsw.ko
Context switch COUNT
Worker 39(50724)->swapper/39(0) 2580
Worker 43(50724)->swapper/43(0) 2424
Worker 40(50724)->swapper/40(0) 2397
Worker 30(50724)->swapper/30(0) 2373
Worker 26(50724)->swapper/26(0) 2337
Worker 16(50724)->swapper/16(0) 2335
swapper/39(0)->Worker 39(50724) 2296
Worker 29(50724)->swapper/29(0) 2255
Worker 45(50724)->swapper/45(0) 2253
Worker 35(50724)->swapper/35(0) 2249
Worker 33(50724)->swapper/33(0) 2240
Worker 44(50724)->swapper/44(0) 2234
Worker 18(50724)->swapper/18(0) 2223
Worker 4(50724)->swapper/4(0) 2222
Worker 15(50724)->swapper/15(0) 2188
swapper/43(0)->Worker 43(50724) 2186
Worker 5(50724)->swapper/5(0) 2181
swapper/40(0)->Worker 40(50724) 2157
Worker 46(50724)->swapper/46(0) 2153
Worker 14(50724)->swapper/14(0) 2143
Worker 28(50724)->swapper/28(0) 2135
Worker 34(50724)->swapper/34(0) 2122
Worker 32(50724)->swapper/32(0) 2088
swapper/30(0)->Worker 30(50724) 2084
Worker 19(50724)->swapper/19(0) 2067
Worker 38(50724)->swapper/38(0) 2065
swapper/16(0)->Worker 16(50724) 2064
swapper/26(0)->Worker 26(50724) 2061
Worker 11(50724)->swapper/11(0) 2060
Worker 10(50724)->swapper/10(0) 2053
Worker 20(50724)->swapper/20(0) 2053
Worker 0(50724)->swapper/0(0) 2048
Worker 8(50724)->swapper/8(0) 2036
Worker 9(50724)->swapper/9(0) 2022
Worker 1(50724)->swapper/1(0) 2013
swapper/44(0)->Worker 44(50724) 2011
swapper/45(0)->Worker 45(50724) 2006
Worker 7(50724)->swapper/7(0) 2003
Worker 25(50724)->swapper/25(0) 1994
swapper/33(0)->Worker 33(50724) 1990
swapper/29(0)->Worker 29(50724) 1989
Worker 27(50724)->swapper/27(0) 1980
swapper/35(0)->Worker 35(50724) 1978
Worker 17(50724)->swapper/17(0) 1974
Worker 24(50724)->swapper/24(0) 1969
swapper/4(0)->Worker 4(50724) 1954
swapper/5(0)->Worker 5(50724) 1940
swapper/18(0)->Worker 18(50724) 1935
Worker 6(50724)->swapper/6(0) 1934
swapper/15(0)->Worker 15(50724) 1928
idle 100130

可以看到压力测试时:work进程和swapper 之间频繁切换  ,work nice值为-20

vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
35 0 0 114990928 23088 576288 0 0 29 4 12 10 3 6 90 1 0
43 0 0 114988320 23148 576916 0 0 0 300 1328680 220374 21 59 20 0 0
36 0 0 114981168 23148 577100 0 0 0 0 1368671 225874 21 59 20 0 0
36 0 0 114976912 23148 577268 0 0 0 224 1321808 232136 21 58 21 0 0
38 0 0 114979312 23148 577748 0 0 0 16 1327994 228364 21 58 21 0 0
^C

 

谁在切换我们的进程_kylin

 

 

cpu 使用情况为:us 21 sy:59(sys+soft)  id=20

总的cs:22w。

为啥会出现work 和swapper 之间频繁切换!!

参考​​main purpose of swapper  https://superuser.com/questions/377572/what-is-the-main-purpose-of-the-swapper-process-in-unix​

The reason is historical and programatic. The idle task is the task running, if no other task is runnable, like you said it. It has the lowest possible priority, so that's why it's running of no other task is runnable.
Programatic reason: This simplifies process scheduling a lot, because you don't have to care about the special case: "What happens if no task is runnable?", because there always is at least one task runnable,
the idle task. Also you can count the amount of cpu time used per task. Without the idle task, which task gets the cpu-time accounted no one needs?
Historical reason: Before we had cpus which are able to step-down or go into power saving modes, it HAD to run on full speed at any time. It ran a series of NOP-instructions, if no tasks were runnable.
Today the scheduling of the idle task usually steps down the cpu by using HLT-instructions (halt), so power is saved. So there is a functionality somehow in the idle task in our days.

 

Process 0 is a special process (called swapper or idle process) which runs when the system is idle, i.e. no other process is scheduled. It is the only process which can invoke the idle() system call
So nowadays process #0 on a Unix is the system process, which effectively holds a number of kernel threads doing a number of things, ranging from page-out operations, 
through filesystem cache flushes and buffer zeroing, to idling when there's nothing else to run.

 

http代理服务器(3-4-7层代理)-网络事件库公共组件、内核kernel驱动 摄像头驱动 tcpip网络协议栈、netfilter、bridge 好像看过!!!! 但行好事 莫问前程 --身高体重180的胖子



标签:task,50724,Worker,swapper,idle,切换,进程,我们,21
From: https://blog.51cto.com/u_15404950/5909897

相关文章

  • [Linux]-----进程信号
    文章目录​​前言​​​​一、什么是信号​​​​我们是如何得知这些信号呢?​​​​我们知道对应的信号产生时,要做什么呢?​​​​二、进程信号​​​​前台进程和后台进程​......
  • Maven 动态切换多 profiles 编译环境
    pom.xml配置<!--Maven动态切换多profiles编译环境--><profiles><!--开发环境--><profile><id>dev</id><!--默认激活--><activation......
  • 批处理配置环境变量,实现多个版本的JDK切换
    一.JDK版本切换批处理脚本我们平时在window上做开发的时候,可能需要同时开发两个甚至多个项目,有时不同的项目对JDK的版本要求有区别,这时候我们可能会在一台电脑上安装......
  • 根据进程名获取进程pid
    摘自:https://blog.csdn.net/shanguangy111/article/details/77136187原理:linux操作系统中有一个名为/proc的虚拟文件系统,其中记录着进程和用户的相关信息,其中/proc/N(注:N......
  • 进程
    0x00进程是运行在操作系统上的人员,操作系统是软件的管理机构负责分配软件的资源。在进程未被启动时,系统不为其分配资源。运行中的进程在系统中所拥有的资源•虚拟地址......
  • 另一个程序已锁定文件的一部分,进程无法访问 打不开磁盘,模块“Disk”启动失败。 未能
    问题描述另一个程序已锁定文件的一部分,进程无法访问产生原因在上网查阅资料得知,这是一种​​虚拟机​​的保护机制虚拟机在运行时,为防止数据被篡改,会将所运行的文件保护起来......
  • 【进程与线程】Linux中进程与线程的区别
    1.线程的创建方法创建线程具体调用pthread_create函数,这个函数实在glibc库中实现。在glibc中pthread_create的调用路径是__pthread_create_2_1->create_thread。其中crea......
  • 那些陪过我们走过OI之旅的小芝士们(入门到省选的一部分,可能有NOI难度的)
    本文参考了12320090913q写的《从零开始的OI之旅》和他的这篇文章、OI-wiki以及kksc03主编的‘深进’OI-wiki序言信息学是很有用的,我们可以用它完成人脑很难独立完成的......
  • 你在终端启动的进程,最后都是什么下场?(下)
    你在终端启动的进程,最后都是什么下场?(下)在上期文章你在终端启动的进程,最后都是什么下场?(上)当中我们介绍了前台进程最终结束的几种情况,在本篇文章当中主要给大家介绍后台进程......
  • Linux杀掉指定的所有进程
    1、ps-ef|grepxxx找出所有的xxx进程2、ps-ef|grepxxx|grep-vgrep过滤掉所有xxx进程中含有关键字grep的进程3、ps-ef|grepxxx|grep-vgrep|......