上一篇文章保证高可用Java服务化系统高效运行的必备工具箱介绍了笔者在互联网公司里线上应急和技术攻关过程中积累的应用层脚本和Java虚拟机命令,这些脚本和命令在发现问题和定位问题的过程中起到关键作用,然而,经常会遇到一些深层次的问题,仅仅通过应用层和JVM虚拟机层的信息无法定位问题和解决问题,这时需要深入研究系统级的各种参数和信息,才能确定问题的根源原因,例如:网络超时、机器负载过高、JVM OOM、JVM和内核Bug等,这篇文章介绍那些重要的Linux基础和监控相关的命令。
本文并不是介绍Linux命令的手册,而是侧重于命令在特定场景下如何帮助应急人员和攻关人员定位问题并解决问题,因此,对于每个命令的介绍将直切主题,直接介绍命令使用的具体场景,而不是介绍命令的详细使用格式。
01
必不可少的基础命令和工具
_
1、grep
grep是Linux下通用的文本内容查找命令。
也可以利用它打印匹配的上下几行,线上查找问题的时候,可以使用下列命令,查找关键字,显示关键字出现行的后5行,并且给关键字着色。
使用方式:
grep -5 'parttern' INPUT_FILE #打印匹配行的前后5行
grep -C 5 'parttern' INPUT_FILE #打印匹配行的前后5行
grep -A 5 'parttern' INPUT_FILE #打印匹配行的后5行
$grep -B 5 'parttern' INPUT_FILE #打印匹配行的前5行
grep -A -15 --color 1010061938 * #查找后着色
2、find
通过文件名称查找文件的存在位置,名称查找支持模糊匹配。
使用方式:
find . -name FILE_NAME
命令输出:
robert@robert-ubuntu1410:~$ find . -name VestaServer.java
./working/workspace/vesta-id-generator/vesta-server/src/main/java/com/robert/vesta/server/VestaServer.java
3、uptime
查看机器的启动时间、登录用户、平均负载等情况,通常用在线上应急或者技术攻关的时候来确定操作系统的重启时间。
使用方式:
uptime
命令输出:
robert@robert-ubuntu1410:~$ uptime
14:42:30 up 2:51, 3 users, load average:0.03, 0.06, 0.06
从上面输出可以看到如下信息:
当前时间:14:42:30
系统已运行的时间:2小时51分
当前在线用户:3个用户
系统平均负载:0.03, 0.06, 0.06,最近1分钟、5分钟、15分钟系统的负载情况
系统平均负载指在特定时间间隔内队列中运行的平均进程数。如果一个进程满足以下条件,它其就会位于运行队列中:
它没有在等待IO操作的结果
它没有主动进入等待状态(也就是没有调用'wait'相关的系统API)
没有被停止(例如:等待终止)
一般来说,每个CPU内核对应活动进程数不大于3,则系统运行良好,换句话说,也就是活动进程数小于CPU核数的3倍。
举例说明,如果你的服务器的cpu有3个核心,那么只要uptime最后输出的一串字符数值小于9,即表示系统负载正常。但是,如果系统负载超过10,那就表示当前系统负载过重,需要定位系统执行任务负载超标的原因。
4、lsof
列出系统当前打开的文件句柄,在Linux文件系统中,任何资源都是以文件句柄的形式管理的,例如:硬件设备、文件、网络套接字等,系统内部为每一种资源分配一个句柄,应用程序只能用操作系统分配的句柄来引用资源,因此,文件句柄为应用程序与基础操作系统之间的交互提供了通用的操作接口。
应用程序打开文件的描述符列表包含了大量的关于应用程序本身的运行信息,因此通过lsof工具查看这个文件句柄列表,对系统监控以及应急排错提供重要的帮助。
查看某一个进程打开的文件句柄:
lsof -p 2862
命令输出:
robert@robert-ubuntu1410:~$ lsof -p 2862 | less
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 2862 robert cwd DIR 8,1 4096 537041 /home/robert/working/workspace/vesta-id-generator/releases/vesta-id-generator-0.0.1-release/bin/vesta-rest-0.0.1
java 2862 robert rtd DIR 8,1 4096 2 /
java 2862 robert txt REG 8,1 5730 1064639 /home/robert/working/softwares/jdk1.8.0_20/bin/java
java 2862 robert mem REG 8,1 7216688 1318996 /usr/lib/locale/locale-archive
java 2862 robert mem REG 8,1 65525265 1189622 /home/robert/working/softwares/jdk1.8.0_20/jre/lib/rt.jar
java 2862 robert mem REG 8,1 80460 1189581 /home/robert/working/softwares/jdk1.8.0_20/jre/lib/i386/libnio.so
java 2862 robert mem REG 8,1 103299 1189580 /home/robert/working/softwares/jdk1.8.0_20/jre/lib/i386/libnet.so
java 2862 robert mem REG 8,1 81884 1583248 /usr/share/locale-langpack/zh_CN/LC_MESSAGES/libc.mo
java 2862 robert mem REG 8,1 3131363 1189479 /home/robert/working/softwares/jdk1.8.0_20/jre/lib/charsets.jar
java 2862 robert mem REG 8,1 3500527 1189621 /home/robert/working/softwares/jdk1.8.0_20/jre/lib/resources.jar
java 2862 robert mem REG 8,1 1179307 1330505 /home/robert/working/softwares/jdk1.8.0_20/jre/lib/ext/localedata.jar
java 2862 robert mem REG 8,1 615948 1189601 /home/robert/working/softwares/jdk1.8.0_20/jre/lib/jsse.jar
java 2862 robert mem REG 8,1 3860522 1330502 /home/robert/working/softwares/jdk1.8.0_20/jre/lib/ext/cldrdata.jar
java 2862 robert mem REG 8,1 1065895 1330501 /home/robert/working/softwares/jdk1.8.0_20/jre/lib/ext/bcprov-jdk15-132.jar
......
查看某一个端口的使用方式:
lsof -i :8080
命令输出:
robert@robert-ubuntu1410:~$ lsof -i :8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 2862 robert 19u IPv6 21370 0t0 TCP *:http-alt (LISTEN)
5、ulimit
Linux系统对每个登录用户,都限制其最大进程数和打开的最大文件句柄数。为提高性能,可以根据硬件资源的具体情况,设置各个用户的最大进程数和打开的最大文件句柄数。
可以用ulimit -a来显示当前的各种系统对用户使用资源的限制:
robert@robert-ubuntu1410:~$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7921
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7921
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
设置用户的最大进程数:
ulimit -u 10240
设置用户可以打开的最大文件句柄数:
ulimit -n xx
6、curl
程序开发后,会使用junit, testng以及jmock, mockito进行单元测试,单元测试后需要进行集成测试,由于当前的线上服务较多使用restful风格,那么集成测试的时候就需要进行HTTP调用,查看返回的结果是否符合预期,curl命令当然是首选测试的方法。
使用方式:
curl -i “http://www.sina.com” #打印请求响应头信息
curl -v “http://www.sina.com” #使用post方法
curl -verbose “http://www.sina.com” #使用post方法
curl -d ‘abc=def’ “http://www.sina.com” #使用head方法
curl -I "http://www.sina.com" #打印HTTP响应码
curl -sw '%{http_code}' "http://www.sina.com" #打印HTTP响应码
7、scp
scp命令是Linux系统中功能强大的文件传输命令,可以实现从本地到远程以及远程到本地的双向文件传输,用起来非常的方便。常用来在线上定位问题时,将线上的一些文件下载到本地进行详查,或者将本地的修改上传到服务器上。
使用方式:
scp [email protected]:/home/robert/test.txt .
scp ./test.txt [email protected]:/home/robert/
8、vi & vim
vi和vim是Linux中最常用的命令行文本编辑工具,vim是vi的升级版本,在某些Linux版本下,vi实际上通过软连接指向vim。
笔者常用的vi/vim命令如下:
h:左移一个字符
l:右移一个字符,这个命令很少用,一般用w代替
k:上移一个字符
j:下移一个字符
set number:显示行号
shift + g:移动到最后一行
1 + shift + g:移动到第一行
n + shift + g:移动到第n行
0: 移动到行首
$:移动到行尾
/text:查找text,按n健查找下一个,按N健查找前一个
?text:查找text,反向查找,按n健查找下一个,按N健查找前一个
i:在当前位置生前插入
I:在当前行首插入
a:在当前位置后插入
A:在当前行尾插入
o:在当前行之后插入一行
O:在当前行之前插入一行
%s/old/new/g:用old替换new,替换当前行的所有匹配
ctrl + f:向下滚动一屏
ctrl + b:向上滚动一屏
u:撤销
U:撤销对整行的操作
Ctrl + r:重做,即撤销的撤销
x:删除当前字符
dd:删除当前行
10d:删除当前行开始的10行
yy:拷贝当前行
p:在当前光标后粘贴,如果之前使用了yy命令来复制一行,那么就在当前行的下一行粘贴
:wq:保存并退出
:q!:强制退出并忽略所有更改
有了这些命令,基本可以在Linux系统命令行下做开发了,无论是开发脚本,还是线上应急或者技术攻关过程中在Linux系统中做编辑,都没有问题,建议大家把上面这个命令列表打印出来,贴在办公桌上,需要的时候可以看一眼,久而久之就记住了。
9、dos2unix&unix2dos
用于转换windows和unix的换行符,通常在windows上开发的脚本和配置,上传到unix上都需要转换。
使用方式:
robert@robert-ubuntu1410:~$ dos2unix test.txt
dos2unix:converting file test.txt to Unix format ...
robert@robert-ubuntu1410:~$ unix2dos test.txt
unix2dos:converting file test.txt to DOS format ...
02
查看活动进程的命令
_
1、ps
显示系统内所有的进程。
使用方式:
ps -elf
输出:
robert@robert-ubuntu1410:~$ ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 8477 poll_s 09:56 ? 00:00:01 /sbin/init
1 S root 2 0 0 80 0 - 0 kthrea 09:56 ? 00:00:00 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo 09:56 ? 00:00:00 [ksoftirqd/0]
1 S root 4 2 0 80 0 - 0 worker 09:56 ? 00:00:00 [kworker/0:0]
1 S root 5 2 0 60 -20 - 0 worker 09:56 ? 00:00:00 [kworker/0:0H]
1 S root 7 2 0 80 0 - 0 rcu_gp 09:56 ? 00:00:00 [rcu_sched]
1 S root 8 2 0 80 0 - 0 rcu_no 09:56 ? 00:00:00 [rcuos/0]
1 R root 9 2 0 80 0 - 0 ? 09:56 ? 00:00:00 [rcuos/1]
1 S root 10 2 0 80 0 - 0 rcu_no 09:56 ? 00:00:00 [rcuos/2]
1 S root 11 2 0 80 0 - 0 rcu_no 09:56 ? 00:00:00 [rcuos/3]
1 S root 12 2 0 80 0 - 0 rcu_gp 09:56 ? 00:00:00 [rcu_bh]
1 S root 13 2 0 80 0 - 0 rcu_no 09:56 ? 00:00:00 [rcuob/0]
1 S root 14 2 0 80 0 - 0 rcu_no 09:56 ? 00:00:00 [rcuob/1]
1 S root 15 2 0 80 0 - 0 rcu_no 09:56 ? 00:00:00 [rcuob/2]
1 S root 16 2 0 80 0 - 0 rcu_no 09:56 ? 00:00:00 [rcuob/3]
......
根据进程的名字或者其他信息,通过grep命令找到目标进程,也可以打印进程启动脚本的全路径。
2、top
查看活动进程的CPU和内存信息的工具命令,能够实时显示系统中各个进程的资源占用情况。可以按CPU和内存的使用情况和执行时间对进程进行排序。
使用方式:
top
命令输出:
top - 10:18:49 up 22 min, 2 users, load average:0.10, 0.31, 0.22
Tasks:195 total, 2 running, 193 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.8 us, 0.2 sy, 0.0 ni, 98.0 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 2049416 total, 1636620 used, 412796 free, 117652 buffers
KiB Swap: 2095100 total, 1480 used, 2093620 free. 643848 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1608 root 20 0 475836 74616 30232 S 4.0 3.6 0:12.21 Xorg
2363 robert 20 0 1380660 103000 63884 S 2.7 5.0 0:12.15 compiz
2157 robert 20 0 589920 30748 24412 S 1.3 1.5 0:00.98 unity-panel-ser
2769 robert 20 0 597884 35820 28008 S 0.7 1.7 0:04.95 gnome-terminal
...
从输出中可以看到整体的cpu占用率、cpu负载的情况、进程占用CPU和内存等资源的情况。另外top命令的输出把cache放在了swap一行,这并不重要,实际上它和swap没有太大的关系。
我们可以用top命令的快捷键转换输出的显示信息:
t:切换显示进程和 CPU 状态信息
m:切换显示进程和 CPU 状态信息
A:分类显示各种系统资源的消耗情况。可用于快速识别系统的性能要求极高的任务
o:改变显示项目的顺序
r:重新设置进程的优先级别(系统提示用户输入需要改变的进程PID以及需要设置
的优先级值)
k:终止一个进程(系统将提示用户输入需要终止的进程PID)
s:改变刷新的时间间隔
u:查看指定用户的进程
03
窥探内存的命令
_
1、free
此命令显示系统内存的使用情况,包括总体内存、已经使用的内存、以及系统核心使用的缓冲区,包括缓存(buffer)和缓冲(cache)等。
使用方式:
free
命令输出:
robert@robert-ubuntu1410:~$ free
total used free shared buffers cached
Mem: 2049416 1646480 402936 13280 118596 646288
-/+ buffers/cache: 881596 1167820
Swap: 2095100 1480 2093620
内存使用并不只有简单的占用和空闲两个状态,从上面的输出发现里面有buffer和cache的数据,从字面意义上来讲,都是缓存,那么弄清楚缓存什么数据才能有效的区分这两种缓存。
从上面命令的输出,我们可以看到,Buffer 118M, Cache 646M。其实,这两个内存区域都是用来缓存磁盘数据的,只不过缓存的数据是不同的:
buffers一般都不太大,在一个通用的Linux系统中,一般都是在几十到几百M字节,用于存储磁盘块设备的元数据,比如哪些块属于哪些文件,文件的权限,目录等信息。
cached一般会很大, 一般都是G字节以上, 用于存储读写文件的页, 当对一个文件进行读的时候, 会取磁盘文件页到此内存区域,然后从内存进行读取,当写入一个文件,会先写到此缓存,并将相关的页面标记为”dirty”。
buffers用于存储元数据,一般占用的空间不大,对它的关注也不多,cached一般会很大,随着读写磁盘的多少而自动的增加而减少,这也取决于物理内存是否够用,如果应用使用物理内存较多,操作系统会适当的缩小cached来保证用户进程对内存的需要。
2、pmap
此命令用来报告进程占用内存的详细情况,可以用来查出某些内存瓶颈问题的根源原因。
使用方式:
pmap -d 2862
命令输出:
robert@robert-ubuntu1410:~$ pmap -d 2862
2862: java -server -Xms512m -Xmx512m -Xmn128m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=60 -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -Xloggc:./logs/gc.log -cp /home/robert/working/workspace/vesta-id-generator/releases/vesta-id-generator-0.0.1-release/bin/vesta-rest-0.0.1/extlib -jar ./lib/vesta-rest-0.0.
Address Kbytes Mode Offset Device Mapping
0000000008048000 4 r-x-- 0000000000000000 008:00001 java
0000000008049000 4 rw--- 0000000000000000 008:00001 java
000000000a017000 872 rw--- 0000000000000000 000:00000 [ anon ]
00000000be800000 896 rw--- 0000000000000000 000:00000 [ anon ]
00000000be8e0000 128 ----- 0000000000000000 000:00000 [ anon ]
00000000be900000 1920 rw--- 0000000000000000 000:00000 [ anon ]
00000000beae0000 128 ----- 0000000000000000 000:00000 [ anon ]
00000000beb00000 284 rw--- 0000000000000000 000:00000 [ anon ]
......
这个命令显示比较底层的进程模块占用内存的信息,并且可以打印内存的起止地址等,用于定位深层次JVM或者操作系统的内存问题。
04
CPU使用情况监控命令
_
1、vmstat
此命令显示关于内核线程、虚拟内存、磁盘IO、陷阱和CPU占用率的统计信息。
使用方式:
vmstat
命令输出:
robert@robert-ubuntu1410:~$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 1480 404300 118252 646216 0 0 78 31 63 145 2 0 97 1 0
这里面需要注意的是:
buff是IO系统用来做存储磁盘块文件元数据的信息
cache是操作系统用来缓存磁盘数据的缓冲区,操作系统会自动调节这个参数,在内存紧张的时候操作系统会减少cache的占用空间来保证其他进程可用
cs参数表达线程切换次数,此数据太大表明线程同步机制有问题
si和so如果较大说明系统频繁使用交换区,应该查看操作系统内存是否够用
bi和bo代表IO活动,根据大小可以知道磁盘的负载
2、mpstat
实时监控系统CPU的一些统计信息,这些信息存放在/proc/stat文件中,在多核CPU系统里,其不但能查看所有CPU的平均使用信息,而且能够查看某一个特定CPU的信息。
使用方式:
mpstat -P ALL
命令输出:
robert@robert-ubuntu1410:~$ mpstat -P ALL
Linux 3.16.0-30-generic (robert-ubuntu1410) 2017年04月23日 _x86_64_ (4 CPU)
11时12分38秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11时12分38秒 all 0.54 0.55 0.23 0.57 0.00 0.04 0.00 0.00 0.00 98.07
11时12分38秒 0 0.75 1.41 0.35 1.06 0.00 0.11 0.00 0.00 0.00 96.32
11时12分38秒 1 0.51 0.22 0.22 0.48 0.00 0.01 0.00 0.00 0.00 98.57
11时12分38秒 2 0.52 0.58 0.18 0.29 0.00 0.02 0.00 0.00 0.00 98.41
11时12分38秒 3 0.40 0.01 0.15 0.45 0.00 0.01 0.00 0.00 0.00 98.98
我们可以看到每个CPU核心的占用率、IO等待、软中断、硬中断等。
05
磁盘IO监控命令
_
1、iostat
监视CPU占用率和平均负载值,以及IO读写速度等。
这个命令的输出的每个字段都非常有用,r/s和w/s指的是IOPS,rkB/s和wkB/s指的是每秒的存取速度,await是平均等待时间,一般都在10ms左右。
另外,iotop、ioprofiler、blktrace可以监控更多底层的IO活动信息,本文就不展开介绍,vmstat、mpstat也有一些IO相关的信息输出。
使用方式:
iostat -x
命令输出:
robert@robert-ubuntu1410:~$ iostat -x
Linux 3.16.0-30-generic (robert-ubuntu1410) 2017年04月23日 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.61 0.68 0.31 0.70 0.00 97.72
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 2.69 3.43 11.92 1.56 217.23 118.91 49.87 0.21 15.45 9.39 61.69 2.18 2.94
从命令输出可以看出:
iowait较大说明IO负载大,IO等待比较严重,磁盘读写遇到瓶颈。
可以直接看到每秒读写速度的最大峰值。
也可以看到CPU的占用率情况。
2、swapon
查看交换分区的使用情况。
使用方式:
/sbin/swapon -s
命令输出:
robert@robert-Latitude-E6440:~/tmp$ /sbin/swapon -s
Filename Type Size Used Priority
/dev/sda6 partition 4094972 708384 -1
由输出可见交换分区共4G,已使用大约708M。
3、df
查看文件系统的硬盘挂载点和空间使用情况。
使用方式:
df
命令输出:
robert@robert-Latitude-E6440:~/tmp$ df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda5 220G 84G 125G 40% /
none 4.0K 0 4.0K 0% /sys/fs/cgroup
udev 2.0G 4.0K 2.0G 1% /dev
tmpfs 395M 1.3M 393M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 2.0G 52M 1.9G 3% /run/shm
none 100M 60K 100M 1% /run/user
06
查看网络信息和网络监控命令
_
1、ifconfig
ifconfig可以查看机器挂载的网卡情况。
使用方式:
ifconfig -a
命令输出:
robert@robert-ubuntu1410:~$ ifconfig -a
eth0 Link encap:以太网 硬件地址 08:00:27:2f:70:b6
inet 地址:192.168.1.102 广播:192.168.1.255 掩码:255.255.255.0
inet6 地址:fe80::a00:27ff:fe2f:70b6/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:14392 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:8665 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:15021524 (15.0 MB) 发送字节:858553 (858.5 KB)
lo Link encap:本地环回
inet 地址:127.0.0.1 掩码:255.0.0.0
inet6 地址:::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 跃点数:1
接收数据包:4161 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:4161 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:0
接收字节:331544 (331.5 KB) 发送字节:331544 (331.5 KB)
可见机器有两个网卡,一个是eth0,一个是本地回环虚拟网卡。
2、ping
ping命令是检测网络故障常用的命令,可以用来测试一台主机到另外一台主机的网络是否联通。
使用方式:
ping www.baidu.com
命令输出:
robert@robert-ubuntu1410:~$ ping www.baidu.com
PING www.a.shifen.com (111.13.100.92) 56(84) bytes of data.
64 bytes from localhost (111.13.100.92):icmp_seq=1 ttl=54 time=4.91 ms
64 bytes from localhost (111.13.100.92):icmp_seq=2 ttl=54 time=8.76 ms
^C
--- www.a.shifen.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 4.917/6.838/8.760/1.923 ms
3、telnet
telnet是TCP/IP协议族的一员,是网络远程登陆服务的标准协议,它为用户提供了在本地计算机上连接远程主机的能力和主要方式。
使用方式:
telnet IP PORT
命令输出:
robert at robert in ~/working/softwares/redis-3.0.5/src $ telnet localhost 6379Trying ::1...
Connected to localhost.
Escape character is '^]'.
get hello
$3
world
从上面输出可以看到,使用telnet协议可以直接连接redis端口,并发送redis命令。
4、nc
nc是NetCat的简称,在网络调试工具享有“瑞士军刀”的美誉,此命令功能丰富、短小精悍、简单实用,被设计成为一个易用的网络工具,可通过TCP/UDP协议传输数据。同时,它也是一个网络应用调试分析器,因为它可以根据需要创建各种不同类型的网络服务和连接,在调试Restful服务的时候,经常会发生不可预期的结果,这种情况下可以使用nc模拟启动服务器,把HTTP客户端连接到nc上,nc上会打印出Restful服务提供的所有参数,然后一一检查参数,找到问题。
当然,也可用于传输二进制或者文本文件。
传输文件端:
robert@robert-ubuntu1410:~$ nc localhost 8888 < test.txt
接受文件端:
robert@robert-ubuntu1410:~$ nc -l 8888
12345678
5、mtr
Linux系统中的网络连通性测试工具,也可以用来检测丢包率。
使用方式:
mtr -r sina.com
命令输出:
robert@robert-ubuntu1410:~$ mtr -r sina.com
Start:Sun Apr 23 16:40:27 2017
HOST:robert-ubuntu1410 Loss% Snt Last Avg Best Wrst StDev
1.|-- 192.168.1.1 0.0% 10 2.0 2.5 0.9 10.4 2.7
2.|-- 172.30.44.1 0.0% 10 6.4 7.5 5.8 13.8 2.3
3.|-- 10.1.10.201 0.0% 10 3.0 3.4 3.0 4.2 0.0
4.|-- 111.63.14.97 0.0% 10 5.5 6.6 5.1 16.4 3.4
5.|-- 111.11.74.9 90.0% 10 10.8 10.8 10.8 10.8 0.0
6.|-- 111.11.65.117 90.0% 10 7.9 7.9 7.9 7.9 0.0
7.|-- 221.183.26.205 80.0% 10 8.0 9.1 8.0 10.1 1.4
8.|-- 221.176.16.250 80.0% 10 11.9 12.8 11.9 13.8 1.0
9.|-- 221.176.21.194 90.0% 10 11.6 11.6 11.6 11.6 0.0
10.|-- 202.97.15.177 90.0% 10 25.1 25.1 25.1 25.1 0.0
11.|-- 202.97.88.237 90.0% 10 14.1 14.1 14.1 14.1 0.0
12.|-- 202.97.53.110 0.0% 10 20.4 16.0 13.7 20.4 2.1
13.|-- 202.97.58.114 0.0% 10 14.4 17.9 14.4 21.4 2.4
14.|-- 202.97.51.86 40.0% 10 211.2 207.4 204.9 211.2 2.5
15.|-- 203.14.186.34 0.0% 10 224.7 201.3 194.9 224.7 10.3
16.|-- 218.30.41.234 0.0% 9 218.1 219.6 215.3 238.7 7.3
17.|-- ??? 100.0 9 0.0 0.0 0.0 0.0 0.0
其中第二列为丢包率,可以用来判断网络中两台机器连通性的质量。
6、nslookup
是一款检测网络中DNS服务器的是否能够正确解析域名的工具命令,并且可以输出。
使用方式:
nslookup sina.com
命令输出:
robert@robert-ubuntu1410:~$ nslookup sina.com
Server: 127.0.1.1
Address: 127.0.1.1#53Non-authoritative answer:
Name: sina.com
Address:66.102.251.33
从输出可以看到,sina.com域名被正确解析到IP地址66.102.251.33。
7、traceroute
traceroute可以提供从你的主机到互联网另一端的主机走的什么路径,然而,每次数据包由某一同样的出发点到达某一同样的目的地走的路径可能会不一样,但通常来说大部分时候所走的路径是相同的。
使用方式:
traceroute sina.com
命令输出:
robert@robert-ubuntu1410:~$ traceroute sina.com
traceroute to sina.com (66.102.251.33), 30 hops max, 60 byte packets
1 192.168.1.1 (192.168.1.1) 4.373 ms 4.351 ms 4.337 ms
2 172.30.44.1 (172.30.44.1) 9.573 ms 10.107 ms 10.422 ms
3 10.1.1.2 (10.1.1.2) 4.696 ms 4.473 ms 4.637 ms
4 111.63.14.97 (111.63.14.97) 6.118 ms 6.929 ms 6.904 ms
5 * * *
6 * * *
7 * * *
8 * * *
9 * * *
10 * * 221.176.23.54 (221.176.23.54) 22.312 ms
11 * * *
12 202.97.53.86 (202.97.53.86) 17.421 ms 202.97.53.34 (202.97.53.34) 29.006 ms 202.97.53.114 (202.97.53.114) 15.464 ms
13 202.97.58.114 (202.97.58.114) 17.840 ms 202.97.58.122 (202.97.58.122) 16.655 ms 20.011 ms
14 202.97.51.86 (202.97.51.86) 207.216 ms 207.157 ms 211.004 ms
15 203.14.186.34 (203.14.186.34) 199.606 ms 196.477 ms 195.614 ms
16 218.30.41.234 (218.30.41.234) 215.134 ms 214.705 ms 220.728 ms
17 66.102.251.33 (66.102.251.33) 209.436 ms 210.263 ms 208.335 ms
上面输出中记录按序列号从1开始,每个纪录就是网络一跳,每跳一次表示经过一个网关或者路由,我们看到每行有三个时间,单位是毫秒,指的是这一跳每次需要的时间。
8、sar
sar是一个多功能的监控工具,使用简单方便,不需要管理员权限,可以输出每秒的磁盘存取速度,适合线上排查问题时使用,命令小巧实用。
使用方式:
sar -n DEV 1 1
命令输出:
robert@robert-ubuntu1410:~$ sar -n DEV 1 1
Linux 3.16.0-30-generic (robert-ubuntu1410) 2017年04月23日 _x86_64_ (4 CPU)
11时02分43秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
11时02分44秒 eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
11时02分44秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
平均时间: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
平均时间: eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
平均时间: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
从上面的用法可以看到网卡的读写速度和流量,在现实的应急过程中,可以用来判断服务器是否上量。
此命令除了可以查看网卡的信息以外,sar可以用来收集更多的服务的状态信息:
-A:所有报告的总和
-u:CPU利用率
-v:进程、I节点、文件和锁表状态
-d:硬盘使用报告
-r:没有使用的内存页面和硬盘块
-g:串口 I/O的情况
-b:缓冲区使用情况
-a:文件读写情况
-c:系统调用情况
-R:进程的活动情况
-y:终端设备活动情况
-w:系统交换活动
9、netstat(ss)
此命令显示网络连接、端口信息等,另外一个命令ss与netstat命令类似,就不单独介绍。
1根据进程查找端口
1).根据进程名字查找进程ID:
ps -elf | grep 进程
输出为:
robert@robert-ubuntu1410:~$ ps -elf | grep vesta
0 S robert 2862 1988 10 80 0 - 233215 futex_ 10:00 pts/0 00:00:22 java -server -Xms512m -Xmx512m -Xmn128m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=60 -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -Xloggc:./logs/gc.log -cp /home/robert/working/workspace/vesta-id-generator/releases/vesta-id-generator-0.0.1-release/bin/vesta-rest-0.0.1/extlib -jar ./lib/vesta-rest-0.0.1.jar
0 R robert 2963 2778 0 80 0 - 3993 - 10:04 pts/0 00:00:00 grep --color=auto vesta
获得进程ID为2862。
2).根据进程ID查找进程开启的端口:
netstat -nap | grep 6588
输出为:
robert@robert-ubuntu1410:~$ netstat -nap | grep 2862
tcp6 0 0 :::8080 :::* LISTEN 2862/java
unix 2 [ ] 流 已连接 21371 2862/java
获得监听端口为8080。
2 根据端口查找进程
1)查找使用端口的进程号:
netstat -nap | grep 8080
输出为:
robert@robert-ubuntu1410:~$ netstat -nap | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 2862/java
获得进程ID为2862。
2)根据进程ID查找进程的详细信息。
ps -elf | grep 2862
输出为:
robert@robert-ubuntu1410:~$ ps -elf | grep 2862
0 S robert 2862 1988 3 80 0 - 233215 futex_ 10:00 pts/0 00:00:23 java -server -Xms512m -Xmx512m -Xmn128m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=60 -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -Xloggc:./logs/gc.log -cp /home/robert/working/workspace/vesta-id-generator/releases/vesta-id-generator-0.0.1-release/bin/vesta-rest-0.0.1/extlib -jar ./lib/vesta-rest-0.0.1.jar
10、iptraf
iptraf是一个实时查看网络流量的交互式的彩色的文本屏幕界面的监控工具。监控的数据比较全面,可输出TCP连接、网络接口、协议、端口、包大小等信息,但是耗费系统资源比较多,需要管理员权限。
使用方式:
sudo iptraf
命令输出:
在进入主界面之前可以选择不同的选项,在不同的选项下,可以查看不同维度的网络信息。
11、tcpdump
网络状况分析跟踪工具,可以用来抓包的一个实用的命令。要使用该工具,需要对TCP/IP协议有所熟悉,因为过滤使用的信息都来自TCP/IP协议的格式。
显示来源IP或者目的IP为192.168.1.102的网络通信:
sudo tcpdump -i eth0 host 192.168.1.102
显示去往102.168.1.102的所有ftp会话信息:
tcpdump -i eth1 'dst 192.168.1.102 and (port 21 or 20)'
显示去往102.168.1.102的所有HTTP会话信息:
tcpdump -ni eth0 'dst 192.168.1.102 and tcp and port 8080'
12、nmap
扫描某一主机打开的端口以及端口提供的服务信息,通常用于查看本机哪些端口对外提供服务,或者确定服务器哪些端口对外开放。
使用方式:
nmap -v -A localhost
命令输出:
robert@robert-ubuntu1410:~$ nmap -v -A localhost
Starting Nmap 6.40 ( http://nmap.org ) at 2017-04-23 12:11 CST
NSE:Loaded 110 scripts for scanning.
NSE:Script Pre-scanning.
Initiating Ping Scan at 12:11
Scanning localhost (127.0.0.1) [2 ports]
Completed Ping Scan at 12:11, 0.00s elapsed (1 total hosts)
Initiating Connect Scan at 12:11
Scanning localhost (127.0.0.1) [1000 ports]
Discovered open port 22/tcp on 127.0.0.1
Discovered open port 8080/tcp on 127.0.0.1
Discovered open port 25/tcp on 127.0.0.1
Discovered open port 3306/tcp on 127.0.0.1
Discovered open port 631/tcp on 127.0.0.1
Completed Connect Scan at 12:11, 0.01s elapsed (1000 total ports)
Initiating Service scan at 12:11
Scanning 5 services on localhost (127.0.0.1)
Completed Service scan at 12:11, 6.04s elapsed (5 services on 1 host)
NSE:Script scanning 127.0.0.1.
Initiating NSE at 12:11
Completed NSE at 12:11, 0.22s elapsed
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00025s latency).
Not shown:995 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh (protocol 2.0)
| ssh-hostkey:1024 95:41:c2:46:25:8d:bc:2d:d1:15:c6:90:ca:a7:8b:bc (DSA)
| 2048 47:32:93:bf:49:df:9c:e7:d7:c5:f8:ef:92:e3:28:c2 (RSA)
|_256 bd:ef:f2:21:01:b1:cb:78:c7:42:a8:f3:5f:40:e3:37 (ECDSA)
25/tcp open smtp Postfix smtpd
|_smtp-commands:robert-ubuntu1410, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN,
| ssl-cert:Subject:commonName=ubuntu-kylin
| Issuer:commonName=ubuntu-kylin
| Public Key type:rsa
| Public Key bits:2048
| Not valid before:2015-10-24T08:56:26+00:00
| Not valid after: 2025-10-21T08:56:26+00:00
| MD5: 2458 afb6 3955 335a b4ad 171e 3917 b222
|_SHA-1:eb49 e335 4352 ccd7 4582 aa2d 1002 7eb3 725e 9045
|_ssl-date:2103-09-27T17:18:12+00:00; +86y157d13h06m52s from local time.
631/tcp open ipp CUPS 1.7
| http-methods:GET HEAD OPTIONS POST PUT
| Potentially risky methods:PUT
|_See http://nmap.org/nsedoc/scripts/http-methods.html
| http-robots.txt:1 disallowed entry
|_/
|_http-title:Home - CUPS 1.7.2
3306/tcp open mysql MySQL 5.5.54-0ubuntu0.14.04.1
| mysql-info:Protocol:10
| Version:5.5.54-0ubuntu0.14.04.1
| Thread ID:38
| Some Capabilities:Long Passwords, Connect with DB, Compress, ODBC, Transactions, Secure Connection
| Status:Autocommit
|_Salt:yB|ixB~v
8080/tcp open http Apache Tomcat/Coyote JSP engine 1.1
|_http-favicon:Unknown favicon MD5:0488FACA4C19046B94D07C3EE83CF9D6
| http-methods:GET HEAD POST PUT DELETE TRACE OPTIONS PATCH
| Potentially risky methods:PUT DELETE TRACE PATCH
|_See http://nmap.org/nsedoc/scripts/http-methods.html
|_http-title:Site doesn't have a title (application/json;charset=UTF-8).
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at http://www.insecure.org/cgi-bin/servicefp-submit.cgi :
SF-Port22-TCP:V=6.40%I=7%D=4/23%Time=58FC2968%P=x86_64-pc-linux-gnu%r(NULL
SF:,2B,"SSH-2\.0-OpenSSH_6\.6\.1p1\x20Ubuntu-2ubuntu2\.8\r\n");
Service Info:Host: robert-ubuntu1410
NSE:Script Post-scanning.
Initiating NSE at 12:11
Completed NSE at 12:11, 0.00s elapsed
Read data files from:/usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done:1 IP address (1 host up) scanned in 6.49 seconds
从上面的输出可以看到,多个端口对外提供服务:
Discovered open port 22/tcp on 127.0.0.1
Discovered open port 8080/tcp on 127.0.0.1
Discovered open port 25/tcp on 127.0.0.1
Discovered open port 3306/tcp on 127.0.0.1
Discovered open port 631/tcp on 127.0.0.1
其中,8080是Vesta发号器对外提供的服务,3306是mysql对外提供的服务。
07
Linux系统高级工具
_
1、pstack
pstack命令用来显示每个进程的调用栈。可以使用pstack来查看进程正在挂起的执行方法,也可以用来查看进程的本地线程堆栈,与JVM的jstack配合可以看到JVM线程运行的全景。
使用方式:
pstack 2862
命令输出:
pstack 9040 >> /tmp/pstack.log
Thread 289 (Thread 0x7f8928bdb700 (LWP 9041)):
#0 0x00000032a480ea5d in accept () from /lib64/libpthread.so.0
#1 0x00007f88735eaad7 in NET_Accept () from /apps/product/jdk1.6.0_19/jre/lib/amd64/libnet.so
#2 0x00007f88735e6ad0 in Java_java_net_PlainSocketImpl_socketAccept () from /apps/product/jdk1.6.0_19/jre/lib/amd64/libnet.so
#3 0x00007f8921010c48 in ?? ()
#4 0x00007f88fca90bd8 in ?? ()
#5 0x00007f88fca90c20 in ?? ()
#6 0x0000000000000001 in ?? ()
#7 0x00007f8928bd9c28 in ?? ()
#8 0x0000000000000000 in ?? ()
Thread 288 (Thread 0x7f88809fe700 (LWP 9042)):
#0 0x00000032a480b5bc in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00007f89291b6757 in os::PlatformEvent::park() () from /apps/product/jdk1.6.0_19/jre/lib/amd64/server/libjvm.so
#2 0x00007f892918fc45 in Monitor::IWait(Thread*, long) () from /apps/product/jdk1.6.0_19/jre/lib/amd64/server/libjvm.so
#3 0x00007f892919040e in Monitor::wait(bool, long, bool) () from /apps/product/jdk1.6.0_19/jre/lib/amd64/server/libjvm.so
#4 0x00007f8928f413b5 in GCTaskManager::get_task(unsigned int) () from /apps/product/jdk1.6.0_19/jre/lib/amd64/server/libjvm.so
#5 0x00007f8928f42663 in GCTaskThread::run() () from /apps/product/jdk1.6.0_19/jre/lib/amd64/server/libjvm.so
#6 0x00007f89291b702f in java_start(Thread*) () from /apps/product/jdk1.6.0_19/jre/lib/amd64/server/libjvm.so
#7 0x00000032a48079d1 in start_thread () from /lib64/libpthread.so.0
#8 0x00000032a40e886d in clone () from /lib64/libc.so.6
......
2、strace
系统调用工具,是Linux系统下的一款程序调试工具,用来监控一个应用程序所使用的
系统调用,通过它可以跟踪系统调用,让你熟悉一个Linux程序在背后是怎么工作的。
适用于想研究Linux底层的工作机制,或者JVM和Linux系统本身的bug导致的技术攻关的场景。
由于虚拟机有问题,没有收集到这部分的输出信息 :(
原文发布时间为:2018-12-19
本文作者:云时代架构
本文来自云栖社区合作伙伴“ [云时代架构](https://mp.weixin.qq.com/s/d_Tl6eiTmpde6eGT5pTaCg
)”,了解相关信息可以关注“cloudate”微信公众号