如何查看进程线程信息

进场听到有说xxx是多线程的、xxx是多进程的,那么如何简单的观察进程/线程信息呢

proc查看法

查看status文件

1
2
3
4
5
6
7
8
9
10
11
#cat /proc/302/status 此时302是mysql的进程号
Name: mysqld
State: S (sleeping)
Tgid: 352
Ngid: 0
Pid: 352
PPid: 1
TracerPid: 0
...
Threads: 28 #开启28个线程
...

查看sched文件

1
2
3
4
5
6
7
8
#cat /proc/302/sched
mysqld (352, #threads: 28) #开启28个进程
-------------------------------------------------------------------
se.exec_start : 252104526.932446
se.vruntime : 273.146127
se.sum_exec_runtime : 248.020804
se.statistics.sum_sleep_runtime : 6783.722198
...

查看具体线程id

1
2
#ls /proc/302/task
352 358 359 360 361 362 363 364 365 366 367 368 369 372 373 374 375 376 377 378 379 380 381 382 383 384 385 388

ps查看法

1
2
3
4
5
6
7
#ps -eLf
UID PID PPID LWP C NLWP STIME TTY TIME CMD
mysql 352 1 352 0 28 17:13 ? 00:00:00 /usr/sbin/mysqld
mysql 352 1 358 0 28 17:13 ? 00:00:00 /usr/sbin/mysqld
mysql 352 1 359 0 28 17:13 ? 00:00:00 /usr/sbin/mysqld
mysql 352 1 360 0 28 17:13 ? 00:00:00 /usr/sbin/mysqld
....

LWP: light weight process 轻量级进程,也就是线程
NLWP: 进程开启的线程数量

pstree查看法

1
pstree -p <进程id|用户名> 显示进程/线程的树形结构 默认进程id1

20170710149967068384759.png
其中没有大括号的是进程信息,后跟进程id
用大括号括起来的是线程信息,后跟线程id

线程id是怎么来的呢?通过man gettid获得

In a single-threaded process, the thread ID is equal to the process ID (PID, as returned by getpid(2)). In a multi‐threaded process, all threads have the same PID, but each one has a unique TID.
单线程进程中,线程id等于进程id。多线程进程中,所有线程拥有共同的进程id,并各自拥有唯一的线程id(tid)