我一直在尝试在 perf 上启用上下文切换事件,并使用 perf 脚本的 perf.data 转储来调查线程阻塞时间。
到目前为止,唯一两个似乎有用的记录选项是上下文切换和所有计划事件。
这是我在 perf 上运行的命令:
perf record -g -a -F 999 -e cpu-clock,sched:sched_stat_sleep,sched:sched_switch,sched:sched_process_exit,context-switches
Run Code Online (Sandbox Code Playgroud)
然而,两者似乎都不完整,通常 sched_switch 事件看起来像这样:
comm1 0/0 [000] 0.0: 1 sched:sched_switch: prev_comm=comm1 prev_pid=0 prev_prio=0 prev_state=S ==> next_comm=comm2 next_pid=1 next_prio=1
stacktrace...
Run Code Online (Sandbox Code Playgroud)
根据我的理解,prev_comm始终是要被阻塞的线程,而next_comm是要被解除阻塞的线程。这是一个正确的假设吗?如果是,我似乎无法获得有关事件的完整数据,因为有许多线程在 prev_comm 上被阻止,但似乎从未获得相应的 next_comm。
启用上下文切换似乎没有多大作用,因为没有有关线程被阻塞或解除阻塞的信息(除非我完全遗漏了一些东西,我希望能解释它们如何工作)。
典型的上下文切换事件如下所示:
comm1 0/0 [000] 0.0: 1 context-switch:
stacktrace...
Run Code Online (Sandbox Code Playgroud)
tl;dr,如何通过 perf 脚本的输出在 Linux 上进行阻塞时间调查以及需要在 perf 记录上启用哪些选项?
谢谢。
在 ps 的联机帮助页中
tid TID the unique number representing a dispatchable
entity (alias lwp, spid). This value may also
appear as: a process ID (pid); a process group
ID (pgrp); a session ID for the session leader
(sid); a thread group ID for the thread group
leader (tgid); and a tty process group ID for
the process group leader (tpgid).
tgid TGID a number representing the thread group to which
a task belongs (alias pid). It is the process
ID …Run Code Online (Sandbox Code Playgroud) 我知道外部命令是通过创建一个单独的进程在 shell 中运行的,但是在 shell 中运行内置命令时究竟会发生什么?
它们是作为函数执行的,还是 shell 创建一个新线程来执行它们?
我一直在阅读有关线程和中断的一些内容。并且有一节说使用线程进行并行编程更简单,因为我们不必担心中断。
但是,如果不是中断,则发出阻塞系统调用释放信号的机制是什么?
例子
我在我的线程中读取 i 文件,该线程使用阻塞系统调用从磁盘读取文件。
在此期间,其他线程正在运行。
在某个时刻,文件已准备好从硬盘中读取。
它是否通过硬件中断通知处理器这一点,以便它可以对请求文件的线程进行上下文切换?
我正在增加nproc我的 rhel6 系统中一个开发用户帐户的限制。在搜索了一些强大的解决方案后,我/etc/security/limits.conf将这两行代码归零:
@dev_user hard nproc 4096
@dev_user soft nproc 4096
Run Code Online (Sandbox Code Playgroud)
在某些情况下,我必须处理如此多的线程,这就是我希望这些数字高的原因。此解决方案也很好地达到了目的。但我的问题是,如果我在任何时候编辑该文件并sudo获得许可,那么它只会在系统重新启动后才会出现。
此 dev_user 仅具有root访问sudo权限。这是我对您的谦虚请求,请向我建议一些无需重启即可完成任务的解决方案。增加的限制也应该持续很长时间,除非没有其他人再次编辑它。
我认为锁、互斥锁、信号量用于同步多个(线程或进程?)以同时访问某些内容。
这个“东西”必须是多个(线程或进程)之间的共享内存吗?
如果是,那是否意味着lock、mutex、semaphore只用于一个进程的多个线程,而不用于多个进程,因为多个进程不共享内存,而同一个进程的多个线程呢?
谢谢。
对于任何进程或任何轻量级进程,tgid 和 pid 都是相同的概念。
在 中/proc/${pid}/status,tgid 和 pid 是不同的字段。对于进程或轻量级进程,tgid 和 pid 是否有所不同?
谢谢。
当我执行 a ps -efT(where -T= Show threads, possibly with SPID column.) 时,我看到所有线程都具有相同的 PID,这是预期的。
myroot 24958 24958 7942 0 20:20 pts/12 00:00:00 java -jar myapp.jar
myroot 24958 24959 7942 0 20:20 pts/12 00:00:11 java -jar myapp.jar
myroot 24958 24960 7942 0 20:20 pts/12 00:00:00 java -jar myapp.jar
myroot 24958 24961 7942 0 20:20 pts/12 00:00:00 java -jar myapp.jar
myroot 24958 24962 7942 0 20:20 pts/12 00:00:00 java -jar myapp.jar
myroot 24958 24963 7942 0 20:20 pts/12 00:00:00 java …Run Code Online (Sandbox Code Playgroud) 假设我们正在编写一个调用 sleep() 函数的 C 程序。例如,通过调用 sleep(7),调用线程将休眠 7 秒。
我的问题是:考虑到每个进程在 CPU 上都有自己的量子时间,因为有许多进程连续运行,线程会在我们的时间/时钟 7 秒后唤醒,还是可能需要更长的时间?