ps 查看系统进程窗状态

详细信息

参数信息:

-a:显示所有终端机下执行的程序,除了阶段作业领导者之外。
a:显示现行终端机下的所有程序,包括其他用户的程序。
-A:显示所有程序。
-c:显示CLS和PRI栏位。
c:列出程序时,显示每个程序真正的指令名称,而不包含路径,选项或常驻服务的标示。
-C<指令名称>:指定执行指令的名称,并列出该指令的程序的状况。
-d:显示所有程序,但不包括阶段作业领导者的程序。
-e:此选项的效果和指定"A"选项相同。
e:列出程序时,显示每个程序所使用的环境变量。
-f:显示UID,PPIP,C与STIME栏位。
f:用ASCII字符显示树状结构,表达程序间的相互关系。
-g<群组名称>:此选项的效果和指定"-G"选项相同,当亦能使用阶段作业领导者的名称来指定。
g:显示现行终端机下的所有程序,包括群组领导者的程序。
-G<群组识别码>:列出属于该群组的程序的状况,也可使用群组名称来指定。
h:不显示标题列。
-H:显示树状结构,表示程序间的相互关系。
-j或j:采用工作控制的格式显示程序状况。
-l或l:采用详细的格式来显示程序状况。
L:列出栏位的相关信息。
-m或m:显示所有的执行绪。
n:以数字来表示USER和WCHAN栏位。
-N:显示所有的程序,除了执行ps指令终端机下的程序之外。
-p<程序识别码>:指定程序识别码,并列出该程序的状况。
p<程序识别码>:此选项的效果和指定"-p"选项相同,只在列表格式方面稍有差异。
r:只列出现行终端机正在执行中的程序。
-s<阶段作业>:指定阶段作业的程序识别码,并列出隶属该阶段作业的程序的状况。
s:采用程序信号的格式显示程序状况。
S:列出程序时,包括已中断的子程序资料。
-t<终端机编号>:指定终端机编号,并列出属于该终端机的程序的状况。
t<终端机编号>:此选项的效果和指定"-t"选项相同,只在列表格式方面稍有差异。
-T:显示现行终端机下的所有程序。
-u<用户识别码>:此选项的效果和指定"-U"选项相同。
u:以用户为主的格式来显示程序状况。
-U<用户识别码>:列出属于该用户的程序的状况,也可使用用户名称来指定。
U<用户名称>:列出属于该用户的程序的状况。
v:采用虚拟内存的格式显示程序状况。
-V或V:显示版本信息。
-w或w:采用宽阔的格式来显示程序状况。 
x:显示所有程序,不以终端机来区分。
X:采用旧式的Linux i386登陆格式显示程序状况。
-y:配合选项"-l"使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位 。
-<程序识别码>:此选项的效果和指定"p"选项相同。
--cols<每列字符数>:设置每列的最大字符数。
--columns<每列字符数>:此选项的效果和指定"--cols"选项相同。
--cumulative:此选项的效果和指定"S"选项相同。
--deselect:此选项的效果和指定"-N"选项相同。
--forest:此选项的效果和指定"f"选项相同。
--headers:重复显示标题列。
--help:在线帮助。
--info:显示排错信息。
--lines<显示列数>:设置显示画面的列数。
--no-headers:此选项的效果和指定"h"选项相同,只在列表格式方面稍有差异。
--group<群组名称>:此选项的效果和指定"-G"选项相同。
--Group<群组识别码>:此选项的效果和指定"-G"选项相同。
--pid<程序识别码>:此选项的效果和指定"-p"选项相同。
--rows<显示列数>:此选项的效果和指定"--lines"选项相同。
--sid<阶段作业>:此选项的效果和指定"-s"选项相同。
--tty<终端机编号>:此选项的效果和指定"-t"选项相同。
--user<用户名称>:此选项的效果和指定"-U"选项相同。
--User<用户识别码>:此选项的效果和指定"-U"选项相同。
--version:此选项的效果和指定"-V"选项相同。
--widty<每列字符数>:此选项的效果和指定"-cols"选项相同。

多种使用方式

ps axo pid,comm,pcpu # 查看进程的PID、名称以及CPU 占用率
ps aux | sort -rnk 4 # 按内存资源的使用量对进程进行排序
ps aux | sort -nk 3  # 按 CPU 资源的使用量对进程进行排序
ps -A # 显示所有进程信息
ps -u root # 显示指定用户信息
ps -efL # 查看线程数
ps -e -o "%C : %p :%z : %a"|sort -k5 -nr # 查看进程并按内存使用大小排列
ps -ef # 显示所有进程信息,连同命令行
ps -ef | grep ssh # ps 与grep 常用组合用法,查找特定进程
ps -C nginx # 通过名字或命令搜索进程
ps aux --sort=-pcpu,+pmem # CPU或者内存进行排序,-降序,+升序
ps -f --forest -C nginx # 用树的风格显示进程的层次关系
ps -o pid,uname,comm -C nginx # 显示一个父进程的子进程
ps -e -o pid,uname=USERNAME,pcpu=CPU_USAGE,pmem,comm # 重定义标签
ps -e -o pid,comm,etime # 显示进程运行的时间
ps -aux | grep named # 查看named进程详细信息
ps -o command -p 91730 | sed -n 2p # 通过进程id获取服务名称

ps aux

$ ps aux

# USER               PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
# kenny             6155  21.3  1.7  7969944 284912   ??  S    二03下午 199:14.14 /Appl...OS/WeChat
# kenny              559  20.4  0.8  4963740 138176   ??  S    二03下午  33:28.27 /Appl...S/iTerm2
# _windowserver      187  18.0  0.6  7005748  95884   ??  Ss   二03下午 288:44.97 /Syst...Light.WindowServer -daemon
# kenny             1408  10.7  2.1  5838592 347348   ??  S    二03下午 138:51.63 /Appl...nts/MacOS/Google Chrome
# kenny              327   5.8  0.5  5771984  79452   ??  S    二03下午   2:51.58 /Syst...pp/Contents/MacOS/Finder

解释:

USER:该 process 属于那个使用者账号的
PID :该 process 的号码
%CPU:该 process 使用掉的 CPU 资源百分比
%MEM:该 process 所占用的物理内存百分比
VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
RSS :该 process 占用的固定的内存量 (Kbytes)
TTY :该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
STAT:该程序目前的状态,主要的状态有
R :该程序目前正在运作,或者是可被运作
S :该程序目前正在睡眠当中 (可说是 idle 状态),但可被某些讯号 (signal) 唤醒。
T :该程序目前正在侦测或者是停止了
Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
START:该 process 被触发启动的时间
TIME :该 process 实际使用 CPU 运作的时间
COMMAND:该程序的实际指令


/proc// 查看进程详细信息

文件夹内共有如下文件和文件夹,其中有一些重要的文件

$ ls
attr       clear_refs       cpuset   fd       limits     mem         net        oom_score      personality  schedstat  stack   syscall  wchan
autogroup  cmdline          cwd      fdinfo   loginuid   mountinfo   ns         oom_score_adj  projid_map   sessionid  stat    task
auxv       comm             environ  gid_map  map_files  mounts      numa_maps  pagemap        root         setgroups  statm   timers
cgroup     coredump_filter  exe      io       maps       mountstats  oom_adj    patch_state    sched        smaps      status  uid_map

status 进程的详细状态

打开后如下

Name:   java
Umask:  0022
State:  S (sleeping)
Tgid:   23813
Ngid:   0
Pid:    23813
PPid:   1
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 512
Groups: 0
VmPeak:  4602840 kB
VmSize:  4471768 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:    709032 kB
VmRSS:    708360 kB
RssAnon:          700516 kB
RssFile:            7844 kB
RssShmem:              0 kB
VmData:  4247320 kB
VmStk:       132 kB
VmExe:         4 kB
VmLib:     60480 kB
VmPTE:      2072 kB
VmSwap:        0 kB
Threads:        510
SigQ:   1/63452
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000003
SigCgt: 2000000181005ccc
CapInh: 0000000000000000
CapPrm: 0000001fffffffff
CapEff: 0000001fffffffff
CapBnd: 0000001fffffffff
CapAmb: 0000000000000000
Seccomp:        0
Cpus_allowed:   f
Cpus_allowed_list:      0-3
Mems_allowed:   00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:      0
voluntary_ctxt_switches:        33
nonvoluntary_ctxt_switches:     5
"status" [readonly] 46L, 1148C

maps 进程申请的内存

打开后如下所示,展示的是申请内存的起始地址和结束地址

e0000000-eab00000 rw-p 00000000 00:00 0
eab00000-f5580000 ---p 00000000 00:00 0
f5580000-faa80000 rw-p 00000000 00:00 0
55f16567a000-55f165844000 rw-p 00000000 00:00 0                          [heap]
7f86d4d93000-7f86d4e93000 rw-p 00000000 00:00 0
7f86d4e93000-7f86d4f93000 ---p 00000000 00:00 0
7f86d4f93000-7f86d4f96000 ---p 00000000 00:00 0
7f86d4f96000-7f86d4fd4000 rwxp 00000000 00:00 0
7f86d4fd4000-7f86d4fd7000 ---p 00000000 00:00 0
7f86d4fd7000-7f86d5015000 rwxp 00000000 00:00 0
7f86d5015000-7f86d5018000 ---p 00000000 00:00 0
7f86d5018000-7f86d5056000 rwxp 00000000 00:00 0
7f86d5056000-7f86d5059000 ---p 00000000 00:00 0
7f86d5059000-7f86d5097000 rwxp 00000000 00:00 0
7f86d5097000-7f86d509a000 ---p 00000000 00:00 0
7f86d5765000-7f86d57a3000 rwxp 00000000 00:00 0
7f86d57a3000-7f86d57a6000 ---p 00000000 00:00 0

smaps 进程申请的内存块的详细信息

详细信息如下:

e0000000-eab00000 rw-p 00000000 00:00 0
Size:             175104 kB
Rss:              143772 kB
Pss:              143772 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:    143772 kB
Referenced:       143140 kB
Anonymous:        143772 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac sd
eab00000-f5580000 ---p 00000000 00:00 0
Size:             174592 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: mr mw me nr sd

pmap Linux 查看内存信息

选项说明
-x, --extended显示扩展的信息
-d, --device显示设备的信息
-q, --quiet不显示头或脚注
-A, --range low,high只显示指定范围的地址空间,低地址和高地址分别用 low 和 high 指定,以逗号分隔
-X显示比-x 更详细的信息。但是会按照文件/proc/PID/smaps 改变显示格式(显示的信息是该文件内容的简化)
-XX显示一切内核提供的信息
-p, --show-path显示文件项的全路径
-c, --read-rc读默认配置(哪里的配置??什么作用?)
-C, --read-rc-from file从 file 读配置
-n, --create-rc新建默认配置
-N, --create-rc-to file创建配置到 file
-h, --help显示帮助信息并退出
-V, --version显示版本信息并退出
返回值解释
Address内存开始地址
Kbytes占用内存的字节数(KB)
RSS保留内存的字节数(KB)
Dirty脏页的字节数(包括共享和私有的)(KB)
Mode内存的权限:read、write、execute、shared、private (写时复制)
Mapping占用内存的文件、或[anon](分配的内存)、或[stack](堆栈)
Offset文件偏移
Device设备名 (major:minor)
8193:   /home/work/emcjdk8/runtime/bin/java -server -Xms6144m -Xmx6144m -Xmn3686m -verbose:gc -Xloggc:/home/work/ai-engine-biz/var/version/1.0.0.189/logs/gc.log -XX:SurvivorRatio=8 -Xss256k -XX:TargetSurvivorRatio=90 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:ConcGCThreads=4 -XX:ParallelGCThreads=4 -XX:+UseCMSCompactAtFullCollection -XX:+CMSScavengeBeforeRemark -XX:CMSInitiatingOccupancyFraction=68 -XX:+UseCMSI
Address           Kbytes     RSS   Dirty Mode   Mapping
0000000000400000       4       4       0 r-x--  java
0000000000400000       4       0       0 r-x--  java
0000000000600000       4       4       4 rw---  java
0000000000600000       4       0       0 rw---  java
000000000170e000   52460   51420   51420 rw---    [ anon ]
000000000170e000   52460       0       0 rw---    [ anon ]
0000000640000000 6307896 5688424 5688424 rw---    [ anon ]
0000000640000000 6307896       0       0 rw---    [ anon ]
00000007c100e000 1032136       0       0 -----    [ anon ]
00000007c100e000 1032136       0       0 -----    [ anon ]
000000318ba00000      84      56       0 r-x--  libz.so.1.2.3
000000318ba00000      84       0       0 r-x--  libz.so.1.2.3
000000318ba15000    2044       0       0 -----  libz.so.1.2.3
000000318ba15000    2044       0       0 -----  libz.so.1.2.3
000000318bc14000       4       4       4 r----  libz.so.1.2.3
000000318bc14000       4       0       0 r----  libz.so.1.2.3
000000318bc15000       4       4       4 rw---  libz.so.1.2.3
000000318bc15000       4       0       0 rw---  libz.so.1.2.3
0000003190600000     148      92       0 r-x--  libpng12.so.0.49.0
0000003190600000     148       0       0 r-x--  libpng12.so.0.49.0
0000003190625000    2048       0       0 -----  libpng12.so.0.49.0
0000003190625000    2048       0       0 -----  libpng12.so.0.49.0
0000003190825000       4       4       4 rw---  libpng12.so.0.49.0
0000003190825000       4       0       0 rw---  libpng12.so.0.49.0
00007f6b53dd2000      12       0       0 -----    [ anon ]
00007f6b53dd2000      12       0       0 -----    [ anon ]
00007f6b53dd5000     248      16      16 rwx--    [ anon ]
00007f6b53dd5000     248       0       0 rwx--    [ anon ]
00007f6b53e13000      12       0       0 -----    [ anon ]
00007f6b53e13000      12       0       0 -----    [ anon ]
00007f6b53e16000     248      16      16 rwx--    [ anon ]
00007f6b53e16000     248       0       0 rwx--    [ anon ]
00007f6b53e54000      12       0       0 -----    [ anon ]
00007f6b53e54000      12       0       0 -----    [ anon ]
00007f6b53e57000     248      88      88 rwx--    [ anon ]
00007f6b53e57000     248       0       0 rwx--    [ anon ]
00007f6b53e95000      12       0       0 -----    [ anon ]
00007f6b53e95000      12       0       0 -----    [ anon ]
00007f6b53e98000     248      88      88 rwx--    [ anon ]

diff 按行比较两个不同文件的 diff

  • diff 主要用来 diff 同一进程不同时间产生的 pmap 数据
    • 常用命令:diff file1.txt file2.txt > diff.txt
    • 详细信息

20211224101039

第一行表示是 6386 与 6418 行作比较

红色与蓝色分别是两个文件的行比较


strace 跟踪系统调用和信号

详细信息

可用参数如下:

-c 统计每一系统调用的所执行的时间,次数和出错的次数等.
-d 输出strace关于标准错误的调试信息.
-f 跟踪由fork调用所产生的子进程.
-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.
-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪.
-h 输出简要的帮助信息.
-i 输出系统调用的入口指针.
-q 禁止输出关于脱离的消息.
-r 打印出相对时间关于,,每一个系统调用.
-t 在输出中的每一行前加上时间信息.
-tt 在输出中的每一行前加上时间信息,微秒级.
-ttt 微秒级输出,以秒了表示时间.
-T 显示每一调用所耗的时间.
-v 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出.
-V 输出strace的版本信息.
-x 以十六进制形式输出非标准字符串
-xx 所有字符串以十六进制形式输出.
-a column 设置返回值的输出位置.默认 为40.
-e expr 指定一个表达式,用来控制如何跟踪.格式:[qualifier=][!]value1[,value2]...
qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一.value是用来限定的符号或数字.默认的 qualifier是 trace.感叹号是否定符号.例如:-eopen等价于 -e trace=open,表示只跟踪open调用.而-etrace!=open 表示跟踪除了open以外的其他调用.有两个特殊的符号 all 和 none. 注意有些shell使用!来执行历史记录里的命令,所以要使用\\.
-e trace=set 只跟踪指定的系统 调用.例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用.默认的为set=all.
-e trace=file 只跟踪有关文件操作的系统调用.
-e trace=process 只跟踪有关进程控制的系统调用.
-e trace=network 跟踪与网络有关的所有系统调用.
-e strace=signal 跟踪所有与系统信号有关的 系统调用
-e trace=ipc 跟踪所有与进程通讯有关的系统调用
-e abbrev=set 设定strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.
-e raw=set 将指定的系统调用的参数以十六进制显示.
-e signal=set 指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号.
-e read=set 输出从指定文件中读出 的数据.例如: -e read=3,5
-e write=set 输出写入到指定文件中的数据.
-o filename 将strace的输出写入文件filename
-p pid 跟踪指定的进程pid.
-s strsize 指定输出的字符串的最大长度.默认为32.文件名一直全部输出.
-u username 以username的UID和GID执行被跟踪的命令

跟踪进程内存分配

  • strace -o strace.txt -p <vmpid> -Ff -Tt -e trace=brk,mmap,munmap

系统调用详细信息

系统调用

进程控制解释
fork创建一个新进程
clone按指定条件创建子进程
execve运行可执行文件
exit终止进程
_exit立即终止当前进程
getdtablesize进程所能打开的最大文件数
getpgid获取指定进程组标识号
setpgid设置指定进程组标志号
getpgrp获取当前进程组标识号
setpgrp设置当前进程组标志号
getpid获取进程标识号
getppid获取父进程标识号
getpriority获取调度优先级
setpriority设置调度优先级
modify_ldt读写进程的本地描述表
nanosleep使进程睡眠指定的时间
nice改变分时进程的优先级
pause挂起进程,等待信号
personality设置进程运行域
prctl对进程进行特定操作
ptrace进程跟踪
sched_get_priority_max取得静态优先级的上限
sched_get_priority_min取得静态优先级的下限
sched_getparam取得进程的调度参数
sched_getscheduler取得指定进程的调度策略
sched_rr_get_interval取得按 RR 算法调度的实时进程的时间片长度
sched_setparam设置进程的调度参数
sched_setscheduler设置指定进程的调度策略和参数
sched_yield进程主动让出处理器,并将自己等候调度队列队尾
vfork创建一个子进程,以供执行新程序,常与 execve 等同时使用
wait等待子进程终止
wait3等待子进程终止
waitpid等待指定子进程终止
wait4等待指定子进程终止
capget获取进程权限
capset设置进程权限
getsid获取会晤标识号
setsid设置会晤标识号
文件读写操作解释
fcntl文件控制
open打开文件
creat创建新文件
close关闭文件描述字
read读文件
write写文件
readv从文件读入数据到缓冲数组中
writev将缓冲数组里的数据写入文件
pread对文件随机读
pwrite对文件随机写
lseek移动文件指针
_llseek在 64 位地址空间里移动文件指针
dup复制已打开的文件描述字
dup2按指定条件复制文件描述字
flock文件加/解锁
pollI/O 多路转换
truncate截断文件
ftruncate截断文件
umask设置文件权限掩码
fsync把文件在内存中的部分写回磁盘
文件操作系统解释
access确定文件的可存取性
chdir改变当前工作目录
fchdir改变当前工作目录
chmod改变文件方式
fhmod改变文件方式
chown改变文件的属主或用户组
fhown改变文件的属主或用户组
lhown改变文件的属主或用户组
chroot改变根目录
stat取文件状态信息
lstat取文件状态信息
fstat取文件状态信息
statfs取文件系统信息
fstatfs取文件系统信息
readdir读取目录项
getdents读取目录项
mkdir创建目录
mknod创建索引节点
rmdir删除目录
rename文件改名
link创建链接
symlink创建符号链接
unlink删除链接
readlink读符号链接的值
mount安装文件系统
umount卸下文件系统
ustat取文件系统信息
utime改变文件的访问修改时间
utimes改变文件的访问修改时间
quotactl控制磁盘配额
系统控制解释
ioctlI/O 总控制函数
_sysctl读/写系统参数
acct启用或禁止进程记账
getrlimit获取系统资源上限
setrlimit设置系统资源上限
getrusage获取系统资源使用情况
uselib选择要使用的二进制函数库
ioperm设置端口 I/O 权限
iopl改变进程 I/O 权限级别
outb低级端口操作
reboot重新启动
swapon打开交换文件和设备
swapoff打开交换文件和设备
bdflush控制 bdflush 守护进程
sysfs取核心支持的文件系统类型
sysinfo取得系统信息
adjtimex调整系统时钟
alarm设置进程的闹钟
getitimer获取计时器值
setitimer设置计时器值
gettimeofday取时间和时区
settimeofday设置时间和时区
stime设置系统日期和时间
time取得系统时间
times取进程运行时间
uname获取当前 UNIX 系统的名称、版本和主机等信息
vhangup挂起当前终端
nfsservctl对 NFS 守护进程进行控制
vm86进入模拟 8086 模式
create_module创建可装载的模块项
delete_module删除可装载的模块项
init_module初始化模块
query_module查询模块信息
*get_kernel_syms取得核心符号,已被 query_module 代替
内存管理解释
brk改变数据段空间的分配
sbrk改变数据段空间的分配
mlock内存页面加锁
munlock内存页面解锁
mlockall调用进程所有内存页面加锁
munlockall调用进程所有内存页面解锁
mmap映射虚拟内存页
munmap去除内存页映射
mremap重新映射虚拟内存地址
msync将映射内存中的数据写回磁盘
mprotect设置内存映像保护
getpagesize获取页面大小
sync将内存缓冲区数据写回硬盘
cacheflush将指定缓冲区中的内容写回磁盘
网络解释
getdomainname取域名
setdomainname设置域名
gethostid获取主机标识号
sethostid设置主机标识号
gethostname获取本主机名称
sethostname设置主机名称
socket 套接字解释
socketcallsocket 系统调用
socket建立 socket
bind绑定 socket 到端口
connect连接远程主机
accept响应 socket 连接请求
send通过 socket 发送信息
sendto发送 UDP 信息
sendmsg通过 socket 发送信息
recv通过 socket 接收信息
recvfrom接收 UDP 信息
recvmsg通过 socket 接收信息
listen监听 socket 端口
select对多路同步 I/O 进行轮询
shutdown关闭 socket 上的连接
getsockname取得本地 socket 名字
getpeername获取通信对方的 socket 名字
getsockopt取端口设置
setsockopt设置端口参数
sendfile在文件或端口间传输数据
socketpair创建一对已联接的无名 socket
用户管理解释
getuid获取用户标识号
setuid设置用户标志号
getgid获取组标识号
setgid设置组标志号
getegid获取有效组标识号
setegid设置有效组标识号
geteuid获取有效用户标识号
seteuid设置有效用户标识号
setregid分别设置真实和有效的的组标识号
setreuid分别设置真实和有效的用户标识号
getresgid分别获取真实的,有效的和保存过的组标识号
setresgid分别设置真实的,有效的和保存过的组标识号
getresuid分别获取真实的,有效的和保存过的用户标识号
setresuid分别设置真实的,有效的和保存过的用户标识号
setfsgid设置文件系统检查时使用的组标识号
setfsuid设置文件系统检查时使用的用户标识号
getgroups获取后补组标志清单
setgroups设置后补组标志清单
进程间通信解释
ipc进程间通信总控制调用
sigaction设置对指定信号的处理方法
sigprocmask根据参数对信号集中的信号执行阻塞/解除阻塞等操作
sigpending为指定的被阻塞信号设置队列
sigsuspend挂起进程等待特定信号
signal参见 signal
kill向进程或进程组发信号
*sigblock向被阻塞信号掩码中添加信号,已被 sigprocmask 代替
*siggetmask取得现有阻塞信号掩码,已被 sigprocmask 代替
*sigsetmask用给定信号掩码替换现有阻塞信号掩码,已被 sigprocmask 代替
*sigmask将给定的信号转化为掩码,已被 sigprocmask 代替
*sigpause作用同 sigsuspend,已被 sigsuspend 代替
sigvec为兼容 BSD 而设的信号处理函数,作用类似 sigaction
ssetmaskANSI C 的信号处理函数,作用类似 sigaction
消息解释
msgctl消息控制操作
msgget获取消息队列
msgsnd发消息
msgrcv取消息
管道解释
pipe 创建管道
信号量解释
semctl信号量控制
semget获取一组信号量
semop信号量操作
共享内存解释
shmctl控制共享内存
shmget获取共享内存
shmat连接共享内存
shmdt拆卸共享内存

jstack 查看 Java 线程信息

使用方法 jstack [-l|-m] <vmpid> 不加 m 参数下,线程 ID(nid)为 16 进制,加 m 参数,线程 ID 为 10 进制

  • l : 看 Java 线程和锁信息
  • m : 看 Java 线程和本地线程信息

jmap 查看 Java 内存信息

查看堆内存详细信息[jmap -heap ]

  • jmap -heap <vmpid>
Attaching to process ID 3764, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.171-b11

using thread-local object allocation.
Parallel GC with 8 thread(s) //采用Parallel GC

Heap Configuration:
   MinHeapFreeRatio         = 0    //JVM最小空闲比率 可由-XX:MinHeapFreeRatio=<n>参数设置, jvm heap 在使用率小于 n 时 ,heap 进行收缩
   MaxHeapFreeRatio         = 100  //JVM最大空闲比率 可由-XX:MaxHeapFreeRatio=<n>参数设置, jvm heap 在使用率大于 n 时 ,heap 进行扩张
   MaxHeapSize              = 2095054848 (1998.0MB) //JVM堆的最大大小 可由-XX:MaxHeapSize=<n>参数设置
   NewSize                  = 44040192 (42.0MB) //JVM新生代的默认大小 可由-XX:NewSize=<n>参数设置
   MaxNewSize               = 698351616 (666.0MB) //JVM新生代的最大大小 可由-XX:MaxNewSize=<n>参数设置
   OldSize                  = 88080384 (84.0MB) //JVM老生代的默认大小 可由-XX:OldSize=<n>参数设置
   NewRatio                 = 2 //新生代:老生代(的大小)=1:2 可由-XX:NewRatio=<n>参数指定New Generation与Old Generation heap size的比例。
   SurvivorRatio            = 8 //survivor:eden = 1:8,即survivor space是新生代大小的1/(8+2)[因为有两个survivor区域] 可由-XX:SurvivorRatio=<n>参数设置
   MetaspaceSize            = 21807104 (20.796875MB) //元空间的默认大小,超过此值就会触发Full GC 可由-XX:MetaspaceSize=<n>参数设置
   CompressedClassSpaceSize = 1073741824 (1024.0MB) //类指针压缩空间的默认大小 可由-XX:CompressedClassSpaceSize=<n>参数设置
   MaxMetaspaceSize         = 17592186044415 MB //元空间的最大大小 可由-XX:MaxMetaspaceSize=<n>参数设置
   G1HeapRegionSize         = 0 (0.0MB) //使用G1垃圾收集器的时候,堆被分割的大小 可由-XX:G1HeapRegionSize=<n>参数设置

Heap Usage:
PS Young Generation //新生代区域分配情况
Eden Space: //Eden区域分配情况
   capacity = 89653248 (85.5MB)
   used     = 8946488 (8.532035827636719MB)
   free     = 80706760 (76.96796417236328MB)
   9.978989272089729% used
From Space: //其中一个Survivor区域分配情况
   capacity = 42467328 (40.5MB)
   used     = 15497496 (14.779563903808594MB)
   free     = 26969832 (25.720436096191406MB)
   36.49275037977431% used
To Space:  //另一个Survivor区域分配情况
   capacity = 42991616 (41.0MB)
   used     = 0 (0.0MB)
   free     = 42991616 (41.0MB)
   0.0% used
PS Old Generation //老生代区域分配情况
   capacity = 154664960 (147.5MB)
   used     = 98556712 (93.99100494384766MB)
   free     = 56108248 (53.508995056152344MB)
   63.722715216167906% used

1819 interned Strings occupying 163384 bytes.

查看当前时间存活的对象[jmap histo:live ]

  • jmap histo:live <vmpid>
num     #instances         #bytes  class name
----------------------------------------------
   1:        299769      282347904  [C
   2:         29215      243886176  [B
   3:         53464       25775552  [Ljava.lang.Object;
   4:          9654       23850568  [J
   5:         11232        7368192  io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueue
   6:        292251        7014024  java.lang.String
   7:        148597        4755104  java.util.HashMap$Node
   8:         16613        3936648  [I
   9:        106917        3421344  java.util.concurrent.ConcurrentHashMap$Node
  10:         21741        2659464  [Ljava.util.HashMap$Node;
  11:         23401        2598168  java.lang.Class
  12:        139773        2236368  java.lang.Integer
  13:           469        1916256  [Ljava.nio.ByteBuffer;
  14:         47086        1883440  java.util.LinkedHashMap$Entry
  15:         20016        1761408  java.lang.reflect.Method
  16:           524        1440816  [D
  17:          5707        1308080  [Lio.netty.util.Recycler$DefaultHandle;
  18:           650        1089008  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  19:         17976        1006656  java.util.LinkedHashMap
  20:         62608        1001728  java.lang.Object
  21:         11357         817704  org.apache.fontbox.afm.CharMetric
  22:         33483         803592  java.util.ArrayList
  23:         22655         724960  java.lang.ThreadLocal$ThreadLocalMap$Entry
  24:         27506         660144  org.springframework.core.MethodClassKey
  25:          9511         638440  [Ljava.lang.String;
  26:         12142         582816  org.apache.tomcat.util.buf.ByteChunk
  27:         11462         550176  org.apache.tomcat.util.buf.CharChunk
  28:         11293         542064  org.apache.tomcat.util.buf.MessageBytes
  29:           300         513600  [Lio.netty.buffer.PoolSubpage;
  30:         10084         484032  java.util.HashMap
  31:          6331         405184  io.netty.buffer.PoolSubpage
  32:          9834         393360  java.util.WeakHashMap$Entry
  33:         11395         364640  org.apache.fontbox.util.BoundingBox
  34:         15243         347416  [Ljava.lang.Class;
  35:         10856         347392  com.baidu.ai.engine.biz.bean.bank.BankCardMetaInfo
  36:         10368         331776  io.netty.buffer.PoolThreadCache$SubPageMemoryRegionCache
  37:          9645         308640  java.util.concurrent.locks.ReentrantLock$NonfairSync
  38:          2258         298464  [Ljava.lang.ThreadLocal$ThreadLocalMap$Entry;
  39:          4559         291776  com.baidu.sjwsserver.model.Key
  40:           583         279776  [Ljava.nio.channels.SelectionKey;

jcmd

  • jcmd <vmpid> help 可以查看所有 VM 支持的命令
30196:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
VM.check_commercial_features
VM.unlock_commercial_features
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.run_finalization
GC.run
VM.uptime
VM.flags
VM.system_properties
VM.command_line
VM.version
help
命令含义使用方式结果
JFR.stop停止正在日志收集的任务
JFR.start开始收集 jfr 文件
JFR.dump停止一个正在执行的日志收集任务,并导出到文件
JFR.check检查执行过和正在执行的日志收集任务
VM.native_memory
VM.check_commercial_features
VM.unlock_commercial_features
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.run_finalization
GC.run
VM.uptime
VM.flags
VM.system_properties
VM.command_line
VM.version

NMT(VM.native_memory)

Java8 给 HotSpot VM 引入了 Native Memory Tracking (NMT)特性,可以用于追踪 JVM 的内部内存使用

开启方法

  • 启动命令中加入 -XX:NativeMemoryTracking=[off | summary | detail]
    • off: 默认关闭
    • summary: 只统计各个分类的内存使用情况
    • detail: 详细内存使用情况,除了 summary 信息之外还包含了虚拟内存使用情况

使用方法

  • jcmd <vmpid> VM.native_memory [summary | detail | baseline | summary.diff | detail.diff | shutdown] [scale= KB | MB | GB]
参数解释
summary分类内存使用情况.
detail详细内存使用情况,除了 summary 信息之外还包含了虚拟内存使用情况。
baseline创建内存使用快照,方便和后面做对比
summary.diff和上一次 baseline 的 summary 对比
detail.diff和上一次 baseline 的 detail 对比
shutdown关闭 NMT
scale以什么单位进行统计
Native Memory Tracking:

Total: reserved=9063MB, committed=7891MB
// reserved:应用可用的内存大小;committed:应用正在使用的内存大小

-                 Java Heap (reserved=6144MB, committed=6144MB)
                            (mmap: reserved=6144MB, committed=6144MB)
                            堆内存

-                     Class (reserved=1147MB, committed=138MB)
                            (classes #21828) // 已经加载的类个数
                            (malloc=3MB #45964)
                            (mmap: reserved=1144MB, committed=135MB)

-                    Thread (reserved=331MB, committed=331MB)
                            (thread #1206)
                            (stack: reserved=325MB, committed=325MB)
                            (malloc=4MB #6036)
                            (arena=1MB #2410)

-                      Code (reserved=260MB, committed=97MB)
                            (malloc=16MB #22618)
                            (mmap: reserved=244MB, committed=81MB)

-                        GC (reserved=35MB, committed=35MB)
                            (malloc=19MB #524)
                            (mmap: reserved=17MB, committed=17MB)
                            垃圾回收占用内存

-                  Compiler (reserved=3MB, committed=3MB)
                            (malloc=3MB #4561)

-                  Internal (reserved=1035MB, committed=1035MB)
                            (malloc=1035MB #46892)
                            命令行解析、JVMTI等占用

-                    Symbol (reserved=30MB, committed=30MB)
                            (malloc=26MB #277470)
                            (arena=3MB #1)
                            string table及constant pool等symbol占用

-    Native Memory Tracking (reserved=6MB, committed=6MB)
                            (tracking overhead=6MB)
                            执行NMT的消耗

-                   Unknown (reserved=71MB, committed=71MB)
                            (mmap: reserved=71MB, committed=71MB)

strings 将二进制或对象文件转换成字符串

详细信息

  • strings file.binary > file.txt 转二进制文件
  • strings -10 file.binary > file.txt 打印字符超过 10 个的行

gdb 进程调试工具

详细使用方式

注入进程

  • gdb -pid <vmpid>
    • quit 退出

dump 内存块

  • dump memory file.binary start_memory_address end_momory_address
    • start_memory_address 和 end_momory_address 可以从进程的 /proc//maps 查到
    • address 的格式为 0x00007f6b53e54000
    • dump 下来的 file.binary 可以用 strings 转换为可读文件
    • 实例:dump memory 7f6b53e54000.bin 0x00007f6b53e54000 0x00007f6b53d54000

内存断点

有 watch/rwatch/awatch 三种命令可以设置断点区别为:

命令含义
watch有改变时断住
rwatch被读时断住
awatch被读写时断住

使用方式 watch *0x00007f6b53e54000 加 * 指对象为一个内存的指针,可以从 pmap 或 /proc//maps 中获取内存块的开头作为指针,一旦断住,则整个进程都会终止,断住之后可以使用 continue 使断点重新执行,直到再次被断住。


perf Linux 性能分析工具

perf 的性能很多,用的最多的是

  • record 用于开始记录信息,退出后自动生成 perf.data 文件,如果有旧文件会自动改为 perf.data.old
  • report 分析 record 生成的报告

使用 perf record/report --help 可以查看命令的详细参数

例子:

  • perf record -g -p <vmpid> 记录进程的性能信息,按 Ctrl+C/Command+C 退出
  • perf record -g -t <threadid> 记录线程的性能信息,按 Ctrl+C/Command+C 退出
  • perf report 分析 perf.data 文件

如图是 report 生成的信息:

20211230172534