linux日常命令记录2(一直更新)

linux命令繁杂,确必不可少,这里用来总结日常用的命令记录,随时更新…

free

free -s 3 # 持续刷新,每3s
free -m 以M展示
free -g 以G展示
free -h 更友好的展示,自动选择单位

free.png

  • total 本机的物理内存+swap
  • used 已使用的内存和swap
  • free 尚未分配的内存和swap
  • shared 被共享的内存的大小,一般可以忽略
  • buff/cache buffer 和 cache 使用的物理内存大小。
  • available 列显示还可以被应用程序使用的物理内存大小。

公式:

  • available = free + buffer/cache
  • total = used + avaliable

free available : 在 free 命令的输出中,有一个 free 列,同时还有一个 available 列。这二者到底有何区别?
free 是真正尚未被使用的物理内存数量。available 是从应用程序的角度看到的可用内存数量。Linux 内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据,就是我们介绍的 buffer 和 cache。所以对于内核来说,buffer 和 cache 都属于已经被使用的内存。当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache 中回收内存来满足应用程序的请求。所以从应用程序的角度来说,available = free + buffer + cache。请注意,这只是一个很理想的计算方式,实际中的数据往往有较大的误差。

另一种展示方式:
free2.png

  • total 物理内总量
  • used 所有已使用的内存,包括实际使用的+bufers + cached
  • free 未被分配的内存
  • shared 共享内存,一般不会用到
  • buffers 系统分配但未被使用的buffers数量
  • cached 系统分配但未被使用的cache数量
  • 第二行 buffers/cache
    • used2 实际使用的buffers 与cache总量,也是实际使用的内存总量
    • free2 未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。

故:
total1 = used1 + free1
total1 = used2 + free2
used1 = buffers1 + cached1 + used2
free2 = free1 + buffers1 + cached1

那么为什么 free 命令不直接称为 cache 而非要写成 buff/cache?

这是因为缓冲区和页高速缓存的实现并非天生就是统一的。在 linux 内核 2.4 中才将它们统一。更早的内核中有两个独立的磁盘缓存:页高速缓存和缓冲区高速缓存。前者缓存页面,后者缓存缓冲区。当你知道了这些故事之后,输出中列的名称可能已经不再重要了。

ss

ss命令用于显示socket状态,建议使用ss命令替代netstat部分命令,例如netsat -ant/lnt等.

time netstat -lnp | wc -l
time ss -lnp | wc -l

ss -tlnp | grep 3100

  • -n 地址使用数字展示(端口默认展示为别名)
  • -p 展示端口所在的进程信息
  • -l 展示listening的端口
  • -t TCP
  • -u UDP

或者

ss -tlnp sport = :3100
sport = :3100
用于过滤

vmstat

vmstat 1 1000 每秒刷新一次,1000次

字段含义说明:

  • Procs(进程)
    • r 等待执行的任务数。展示了正在执行和等待cpu资源的任务个数。当这个值超过了cpu个数,就会出现cpu瓶颈。
    • B 等待IO的进程数量
  • Memory(内存)
    • swpd 正在使用虚拟的内存大小,单位k
    • free 空闲内存大小
    • buff 已用的buff大小,对块设备的读写进行缓冲
    • cache 已用的cache大小,文件系统的cache
    • inact 非活跃内存大小,即被标明可回收的内存,区别于free和active
    • active 活跃的内存大小
  • Swap
    • si 每秒从交换区写入内存的大小(单位:kb/s)(注意是写入)
    • so 每秒从内存写到交换区的大小
  • IO
    • bi 每秒读取的块数(读磁盘)(注意是读!就是读!)。现在的Linux版本块的大小为1024bytes。
    • bo 每秒写入的块数(写磁盘)
  • system
    • in 每秒中断数,包括时钟中断,这两个值越大,会看到由内核消耗的cpu时间会越多
    • cs 每秒上下文切换数
  • CPU(以百分比表示)
    • Us 用户进程执行消耗cpu时间(user time)。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期超过50%的使用,那么我们就该考虑优化程序算法或其他措施了
    • Sy 系统进程消耗cpu时间(system time)。sys的值过高时,说明系统内核消耗的cpu资源多,这个不是良性的表现,我们应该检查原因。
    • Id 空闲时间(包括IO等待时间)
    • wa 等待IO时间。Wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。

关于bi,bo,wa: vmstat下表io下面的bi表示读取和bo表示写入,单位是block(硬盘读写的最小单位是扇区,一个扇区是512 bytes。一次硬盘读写的数据量不会超过512 bytes,这一次读写的数据量就称为1个block。在大文件的读写操作中,基本可以按乘512来根据block计算出读写的实际数据量,误差很小。)cpu下面的wa,这个wa就是wait的缩写,代表的意思是CPU在等待硬盘读写操作的时间,用百分比表示。wait越大则机器io性能就越差。

iostat

iostat 1 10 每1s刷新一次,刷新十次

ps

$ ps -ef | grep nginx
$ sudo lsof -nP -i:9300 # 端口 -> 进程
$ sudo netstat -tlnp | grep port # 端口 -> 进程
$ sudo lsof -p 12764 | grep TCP # 进程 -> 端口
$ sudo netstat -tlnp | grep pid # 进程 -> 端口

lsof

查看进程正在打开文件、网络、socket的状态

ps -ef | grep nginx  #进程名 -> pid
sudo lsof -i :9300 # 端口号 -> 进程
sudo lsof -i @140.143.60.140 # ip地址 -> 进程
lsof -p 12764 | grep TCP # 进程 -> 端口
或者
lsof -i | grep 12764 # 进程 -> 端口
lsof -p 12764 # 进程 -> 打开资源状态,包括文件、网络、socket等

-n no host names
-P no port names
-i select by IPv[46] address: [46][proto][@host|addr][:svc_list|port_list]
-p exclude(^)|select PIDs

mac:

sudo lsof -nP -i :20002
sudo lsof -p 1234 -P # -P显示端口号

netstat

查看当前的网络连接状态,主要用来查看本机和外部的的网络连接,包括端口,连接情况

netstat -anp # 所有端口
netstat -tlnp # 所有listening的tcp端口

netstat -tlnp | grep tcp | grep port # 端口 -> 进程
netstat -tlnp | grep pid # 进程 -> 端口

$ netstat -at # 所有 tcp
$ netstat -au # 所有 udp

# -p (root)Show the PID and name of the program to which each socket belongs
# -n 不显示主机\端口\用户名,加速输出
# -t 显示tcp连接
# -u 显示udp

# -a Show both listening and non-listening (for TCP this means established connections) sockets
# -l Show only listening sockets. (These are omitted by default.)

top

命令参数:

top -p 11232 # 仅展示某个进程
top -H -p pid # 显示某个进程所有活跃的线程消耗情况。
top -c # 展示进程详细信息

执行命令:

  • -p 监控特定的PID
  • -c 命令行列显示程序名以及参数
  • -H 设置为线程模式

快捷键总结:

  • V 大写V,以进程树的形式展示命令行列
  • c 命令行列显示程序名以及参数
  • E 更改总体内存展示单位
  • e 更改每个进程内存展示的单位
  • 1 展示每个单核的负荷
  • P 大写P 按cpu排序
  • M 大写M 按内存排序
  • t 可以更动态的展示cpu
  • m 更动态的展示内存
  • f 更改展示字段
  • s 改变更新周期
  • %cpu可能会超过100%,因为是多核心负荷的累加。如果是12核机器,最多可达1200%!。使用cat /proc/cpuinfo| grep "processor"| wc -l查看核心数

实用的内部命令:

top 运行中可以通过 top 的内部命令对进程的显示方式进行控制。内部命令如下:
s – 改变画面更新频率
l – 关闭或开启第一部分第一行 top 信息的表示
t – 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示
m – 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示
N – 以 PID 的大小的顺序排列表示进程列表
P – 以 CPU 占用率大小的顺序排列进程列表
M – 以内存占用率大小的顺序排列进程列表
h – 显示帮助
n – 设置在进程列表所显示进程的数量
q – 退出 top
s – 改变画面更新周期

字段含义:

序号 列名 含义
a PID 进程id
b PPID 父进程id
c RUSER Real user name
d UID 进程所有者的用户id
e USER 进程所有者的用户名
f GROUP 进程所有者的组名
g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
h PR 优先级
i NI nice值。负值表示高优先级,正值表示低优先级
j P 最后使用的CPU,仅在多CPU环境下有意义
k %CPU 上次更新到现在的CPU时间占用百分比
l TIME 进程使用的CPU时间总计,单位秒
m TIME+ 进程使用的CPU时间总计,单位1/100秒
n %MEM 进程使用的物理内存百分比
o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
q RES 驻留内存大小。驻留内存是任务使用的非交换物理内存大小,RES=CODE+DATA
r CODE 可执行代码占用的物理内存大小,单位kb
s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t SHR 共享内存大小,单位kb
u nFLT 页面错误次数
v nDRT 最后一次写入到现在,被修改过的页面数。
w S 进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
x COMMAND 命令名/命令行
y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
z Flags 任务标志,参考 sched.h

默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容。

通过 f 键可以选择显示的内容。按 f 键之后会显示列的列表,按 a-z 即可显示或隐藏对应的列,最后按回车键确定。
按 o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z 可以将相应的列向左移动。最后按回车键确定。
按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序。而大写的 R 键可以将当前的排序倒转。

ip

ip addr  # 网络状态
ifconfig # 网络状态

# 外网地址
$ curl ifconfig.me
$ curl icanhazip.com
$ curl ident.me

ls

mac:
ls -lT
-T 参数展示详细时间

linux:
ls --full-time
ls -la --time-style=full-iso
--full-time
--time-style=full-iso

ps

ps -ef、ps aux命令可以展示进程的大概信息,启动时间展示不完整,如果想得知进程的详细启动时间,怎么办呢?

linux:
$ ps -eo pid,lstart,cmd

outPut:
PID STARTED CMD
1 Mon Jun 19 21:31:08 2017 /sbin/init
2 Mon Jun 19 21:31:08 2017 [kthreadd]
3 Mon Jun 19 21:31:08 2017 [ksoftirqd/0]

系统信息

# linux内核信息
cat /proc/version
uname -a
# 查看linux发行版信息
lsb_release -a
# cpu核心数
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
# 内存情况
cat /proc/meminfo
free
# 磁盘情况
sudo fdisk -l

Linux查看物理CPU个数、核数、逻辑CPU个数
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq
# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l
# 查看CPU信息(型号)
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

pidstat

使用示例

pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]

# pid4989的cpu详细详细,每个1s打印一次,打印8次
pidstat -u -p 4989 1 8
# 内存
pidstat -r -p 4989 1 8
# 磁盘
pidstat -d -p 4989 1 8
# 展示三者
pidstat -urd -p 4989 1 8
# -h 在一行展示所有信息
pidstat -urdh -p 4989 1 8
# 更多
man pidstat

参数说明

-u:默认的参数,显示各个进程的cpu使用统计
-r:显示各个进程的内存使用统计
-d:显示各个进程的IO使用情况
-p:指定进程号
-w:显示每个进程的上下文切换情况
-t:显示选择任务的线程的统计信息外的额外信息
-T { TASK | CHILD | ALL }
这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。
注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
-V:版本号
-h:在一行上显示了所有活动,这样其他程序可以容易解析。
-I:在SMP环境,表示任务的CPU使用率/内核数量
-l:显示命令名和所有参数