当我运行时top -H
,我看到我的多个mysql
线程都有相同的 PID。然而,ps -eLf
我看到每个都有不同的 PID:
ps -eLf
UID PID PPID LWP C NLWP STIME TTY TIME CMD
mysql 1424 1 1424 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1481 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1482 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1483 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1484 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1485 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1486 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1487 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1488 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1489 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1490 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1791 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1792 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1793 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1794 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1809 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1812 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
并在top -H
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1424 mysql 20 0 539m 56m 7200 S 0.0 1.5 0:00.08 mysqld
1481 mysql 20 0 539m 56m 7200 S 0.0 1.5 0:00.16 mysqld
1482 mysql 20 0 539m 56m 7200 S 0.0 1.5 0:00.33 mysqld
1483 mysql 20 0 539m 56m 7200 S 0.0 1.5 0:00.16 mysqld
1484 mysql 20 0 539m 56m 7200 S 0.0 1.5 0:00.23 mysqld
1485 mysql 20 0 539m 56m 7200 S 0.0 1.5 0:00.27 mysqld
1486 mysql 20 0 539m 56m 7200 S 0.0 1.5 0:00.15 mysqld
1487 mysql 20 0 539m 56m 7200 S 0.0 1.5 0:00.18 mysqld
1488 mysql 20 0 539m 56m 7200 S 0.0 1.5 0:00.16 mysqld
1489 mysql 20 0 539m 56m 7200 S 0.0 1.5 0:00.16 mysqld
1490 mysql 20 0 539m 56m 7200 S 0.0 1.5 0:00.34 mysqld
1791 mysql 20 0 539m 56m 7200 S 0.0 1.5 0:00.26 mysqld
1792 mysql 20 0 539m 56m 7200 S 0.0 1.5 0:00.54 mysqld
1793 mysql 20 0 539m 56m 7200 S 0.0 1.5 0:00.00 mysqld
1794 mysql 20 0 539m 56m 7200 S 0.0 1.5 0:00.00 mysqld
1809 mysql 20 0 539m 56m 7200 S 0.0 1.5 0:00.00 mysqld
1812 mysql 20 0 539m 56m 7200 S 0.0 1.5 0:00.13 mysqld
发生了什么事,我应该相信哪一个?
答案1
他们实际上以不同的方式显示相同的信息。这就是-f
和-L
选项要做ps
的事情(来自man ps
,强调我的):
-f 进行完整格式列表。此选项可以与许多其他 UNIX 样式选项结合使用以添加其他列。它还会导致打印命令参数。与 -L 一起使用时,将添加 NLWP(线程数)和 LWP(线程 ID)列。
-L 显示线程,可能与 LWP 和 NLWP 色谱柱一起使用。
tid TID 代表可调度实体的唯一编号(别名 lwp、spid)。该值也可能显示为:进程 ID (pid);进程组 ID (pgrp);会话领导者的会话 ID (sid);线程组领导者的线程组 ID (tgid);以及进程组领导者的 tty 进程组 ID (tpgid)。
因此,ps
将在列中显示线程 ID,LWP
而该PID
列是实际的进程标识符。
top
另一方面,列出了该PID
列中的不同线程,尽管我在 中找不到对此的明确提及man top
。
答案2
这只是呈现方式上的差异。查看输出LWP
中的列ps
-LWP
是八个L
过程。内核可以区分完整进程和线程,但它仍然必须使用与调度进程相同的机制独立地调度它们(这是线程的目的),因此调度程序看到的 id 必须是唯一的,最好的实现方法是为每个目的使用一个进程和线程 ID 池,并使用其他方法来区分这两种类型。W
P
答案3
您会看到父进程1424
,该进程创建了一个或多个子进程 ( the other PIDs
)。