我运行iotop以检查重度磁盘用户的程序,以防我需要降低它们的优先级。通常这已经足够了,但iotop只显示线程 ID (TID),有时我想知道进程 ID (PID),以便我可以找到有关哪个进程负责的更多信息。
不幸的是,虽然ps可以显示 TID(又名 SPID,LWP),但它没有一个标志来获取 TID 列表,就像处理带有--pid. 我能做的最好的事情就是列出 TID,然后grep是输出。例如,如果线程 id 是 792,我可以这样做
$ ps -eLf | grep ' 792 '
Run Code Online (Sandbox Code Playgroud)
这工作得相当好,但有点不优雅。
有没有更好的办法?
继“如何将 strace 附加到不在 ps 输出中的进程? ”中描述的问题之后。
我正在尝试调试一个中途挂起的进程。
通过strace -f在我的父进程上使用,我能够确定我有一堆正在显示的线程:
# strace -p 26334
Process 26334 attached - interrupt to quit
epoll_wait(607, {}, 4096, 500) = 0
epoll_wait(607, {}, 4096, 500) = 0
epoll_wait(607, {}, 4096, 500) = 0
epoll_wait(607, {}, 4096, 500) = 0
epoll_wait(607, ^C <unfinished ...>
Process 26334 detached
Run Code Online (Sandbox Code Playgroud)
进一步调查:
# readlink /proc/26334/fd/607
anon_inode:[eventpoll]
Run Code Online (Sandbox Code Playgroud)
我的直觉告诉我,我已经设法让一些线程处于死锁状态,但我epoll对继续前进的了解还不够多。是否有任何命令可以让我深入了解这些线程正在轮询什么,或者这个 epoll 描述符映射到哪些文件描述符。
Linux 应用程序通常 fork 然后 exec(使用 execve() ),但 Java 应用程序和某些 Apache MPM 使用线程。如果fork,使用fork + exec来生成一个进程,线程的高级版本是什么?JVM 或 Worker MPM 如何产生线程?
一个简单的例子。我正在运行一个使用 TCP 套接字处理 http 请求的进程。它可能 A) 计算一些意味着 CPU 将成为瓶颈的东西 B) 发送一个可能导致网络成为瓶颈的大文件或 C) 具有半随机访问的复杂数据库查询导致磁盘瓶颈
我是否应该尝试将每个页面/API 调用归类为上述类型中的一种或多种,并尝试平衡每种调用的数量?或者操作系统会为我这样做吗?我如何决定我想要多少线程?
我将为硬件线程 12 和 48 使用 2 个数字(英特尔至强有那么多)。我想有 2/3 的线程用于重型 CPU(8/32),1 个线程用于重型磁盘(或每个磁盘 1 个重型线程),其余 3/15 用于其他任何事情,这意味着不要尝试平衡网络。
我是否应该在仅支持 12/48 线程的硬件上拥有超过 12/48 的线程?我想要更少,所以我不会导致 CPU 进入较慢的节流模式(我忘记了它的名字,但我听说如果一次激活太多芯片会发生这种情况)。如果我必须加载和资源平衡我的线程,我会怎么做?
我在网上搜索了这个问题的答案,但找不到明确的答案。我找到的最佳答案如下:
kondemand 是一个内核线程,属于 cpufreq 子系统的 ondemand 调控器,它根据利用率统计改变系统的 p-state。因此,它有助于电源管理。
但是对于kondemand 以何种方式帮助电源管理的含义仍然存在不确定性,或者它真的是与电源管理有关的进程/线程?
有人可以解释一下吗?
我运行了程序 pstree -p 31872 ,它打印了以下输出:
ruby(31872)???{ruby}(31906)
??{ruby}(32372)
Run Code Online (Sandbox Code Playgroud)
pstree 的手册页说:
进程的子线程位于父进程下,并用花括号中的进程名称显示,例如
Run Code Online (Sandbox Code Playgroud)icecast2---13*[{icecast2}]
(以上显示不同,因为缺少 -p 选项,禁用压缩。)
在没有 -p 的情况下运行 pstree 31872 给出:
ruby???2*[{ruby}]
Run Code Online (Sandbox Code Playgroud)
当我尝试使用ps观察那些 PIDS 时,没有找到任何结果。但是,pid 存在于 /proc 中。
我的问题是,为什么线程会有不同的 pid?我希望它们与过程相同(31872)。运行 htop 时观察到相同的行为。
我正在尝试禁用本地计时器中断以实现低延迟。我在内核配置中启用了完全无滴答模式,并且为相关内核设置了引导参数 nohz_full。
然而,当我通过 /proc/interrupts 查看中断计数时,我看到本地定时器中断每核心每秒计数 1000 次,这意味着完全无滴答不起作用。
无滴答模式文档说,为了使无滴答工作,只有一个正在运行的进程需要在那个核心上。
当我查看顶部时,我在给定的核心(本例中的核心 1)下看到以下内容:
19 root RT 0 0 0 0 S 0.0 0.0 0:00.00 1 watchdog/1
20 root -2 0 0 0 0 S 0.0 0.0 0:02.15 1 rcuc/1
21 root RT 0 0 0 0 S 0.0 0.0 0:00.04 1 migration/1
22 root -2 0 0 0 0 S 0.0 0.0 0:00.25 1 ksoftirqd/1
23 root RT 0 0 0 0 S 0.0 0.0 0:00.00 1 posixcputmr/1
24 root 20 0 0 …Run Code Online (Sandbox Code Playgroud) POSIX 上下文切换是否定义明确?它与在 C 中切换线程相同吗?C 编译器能否为上下文切换生成所有内容,或者切换线程或切换“上下文”的例程是否仍然需要汇编编程?甚至定义了“上下文”的含义-它与线程不一样吗?
如果我想检查是否达到了 nproc 值的最大值,我应该这样做:
ps -ef | wc -l
Run Code Online (Sandbox Code Playgroud)
或者
ps -efL | wc -l
Run Code Online (Sandbox Code Playgroud)
nproc inlimits.conf是指进程数还是线程数?
据我所知,在 Linux 内核中,
该结构task_struct代表线程,即轻量级进程,但不是进程。
进程不由任何结构表示,而是由共享相同线程组 ID 的线程组表示。
那么操作系统概念中的以下内容是否正确?
Linux 还提供了使用
clone()系统调用创建线程的能力。但是,Linux 不区分进程和线程。事实上,Linux 使用术语任务——而不是进程或线程——来指代程序中的控制流。
这是什么意思?
谢谢。
thread ×10
process ×5
linux ×4
kernel ×2
linux-kernel ×2
ps ×2
fork ×1
htop ×1
latency ×1
lightweight ×1
performance ×1
pthreads ×1
scheduling ×1
ulimit ×1