此篇记录一下工作中常用的Linux分析、定位、工具命令。

日志

记录很多信息,系统有问题时的必查文件

/var/log/messages

Top

top 命令中关于程序使用内存的项介绍:

%MEM:Memory usage (RES) 内存占用 使用的物理内存
VIRT:Virtual Image (kb) 虚拟镜像 总虚拟内存的使用数量
SWAP:Swapped size (kb) 非驻留但是存在于程序中的内存,虚拟内存减去物理内存
RES:Resident size (kb) 非 swap 的物理内存
SHR:Shared Mem size (kb) 程序使用的共享内存,可以被其它进程所共享

系统类

CPU总核数 = 物理CPU个数 * 每颗物理CPU的核数
总逻辑CPU数 = 物理CPU个数 * 每颗物理CPU的核数 * 超线程数

查看CPU信息(型号)

cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

查看物理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

查看服务器IP连接数

netstat -tun | awk '{print $5}' | cut -d : -f1 | sort | uniq -c | sort -n

查看是否有僵死进程

lsof | grep deleted

查找文件

命令 作用 说明
which 查看可执行文件的位置 通过 PATH 环境变量到该路径内查找可执行文件
whereis 查看文件的位置 只能查二进制文件(含可执行文件)、说明文档,源文件等,可能有延迟
locate 配合文件数据库查看文件位置 在数据库里查找,数据库大致每天更新一次,文件名是部分匹配
find 实际搜寻硬盘来查询文件名称 最强大,根据条件查找文件,在硬盘上查找效率较低

查找当前路径下大于1M的文件

find . -size +1M

查找当前目录下5天之内修改且以conf结尾的文件

find . -mtime -5 -name '*.conf'

统计类

awk

求和

awk 'BEGIN{sum=0}{sum+=$1}END{print sum}' num.txt

grep

grep 'keywords' data.txt
grep -C5 'keywords' data.txt // 显示keywords的所在行及前后5行的信息
grep -A5 'keywords' data.txt // 显示keywords的所在行及之后5行的信息
grep -B5 'keywords' data.txt // 显示keywords的所在行及之前5行的信息

iostat

监控磁盘IO

iostat 1

网络/磁盘IO

网络IO:数据通过以太网接口进行读写时也会造成阻塞,阻塞情况跟网络带宽有关。

netstat

查看网络状态

netstat -an | grep 8080

查看特定的几种网络连接状态

netstat -lna | egrep "TIME_WAIT | CLOSE_WAIT | ESTABLISHED"

文件处理

uniq

使用uniq求文件的交集、并集和差集

  1. 交集
sort a.txt b.txt | uniq -d
sort后面的参数,如 -n 表示按照数字格式排序,如 -i 表示忽略大小写,如-r 表示为逆序输出。
uniq为删除文件中重复的行,得到文件中唯一的行,参数 -d 表示的是输出出现次数大于1的内容,参数-u表示的是输出出现次数为1的内容。
  1. 并集
sort a.txt b.txt | uniq
  1. 差集
a.txt-b.txt:
sort a.txt b.txt b.txt | uniq -u

将两个文件排序,最后输出a.txt b.txt b.txt文件中只出现过一次的内容,因为有两个b.txt,所以只会输出只在a.txt出现过一次的内容,即a.txt-b.txt差集。对于b.txt-a.txt同理。

b.txt - a.txt:
sort b.txt a.txt a.txt | uniq -u

磁盘信息

df -lh

curl

curl -o /dev/null -s -w " http_code:%{http_code}\n time_namelookup:%{time_namelookup}\n time_redirect:%{time_redirect}\n time_pretransfer:%{time_pretransfer}\n time_connect:%{time_connect}\n time_starttransfer:%{time_starttransfer}\n time_total:%{time_total}\n speed_download:%{speed_download}\n " "https://www.baidu.com"

curl输出


 http_code:200
 time_namelookup:0.014694       //DNS解析时间,从请求开始到DNS解析完毕所用时间。
 time_redirect:0.000000         //重定向时间,包括到最后一次传输前的几次重定向的DNS解析,连接,预传输,传输时间。
 time_pretransfer:0.049093      //从开始到准备传输的时间。
 time_connect:0.020436          //连接时间,从开始到建立TCP连接完成所用时间,包括前边DNS解析时间,如果需要单纯的得到连接时间,用这个time_connect时间减去前边time_namelookup时间。
 time_starttransfer:0.056731    //开始传输时间。在发出请求之后,Web 服务器返回数据的第一个字节所用的时间。
 time_total:0.056884            //总时间,按秒计。精确到小数点后三位。
 speed_download:43625.000

 另外,如有:
 time_appconnect        //连接建立完成时间,如SSL/SSH等建立连接或者完成三次握手时间。

lsof

列出打开的文件及相应的进程(list open files)

lsof -i:8080

进程/调用

strace

使用 strace 跟踪用户进程和 Linux 内核之间的交互

测试

ab

Apache Benchmarking tool,一个简易的压力测试工具命令。

ab -c 500 -t 10 -r "http://127.0.0.1:8080/"

参数释义如下:

参数 含义
c 并发量。默认是一次一个。
t 测试执行时间,单位为秒。默认没有时间限制。
r 即使遇到socket接收报错也不退出
n 请求的总数量。默认时,仅执行一个请求。
k 使用HTTP KeepAlive特性,即在一个HTTP会话中执行多个请求
p 需要post的数据文件
v 显示详细信息
V 显示版本号并退出
i 执行HEAD请求,而不是GET
w 以html表格方式输出结果
x 设置属性的字符串
X 对请求使用代理服务器
C 对请求附加一个Cookie行
H 对请求附加额外的头信息
T POST数据所使用的Content-type 头信息

使用ab进行post请求压测:

ab -n 1000 -c 100 -p text.json http://127.0.0.1:8080

注意:在使用ab命令时,如果并发过高时出现错误:Too many open files,则说明系统打开文件数量被限制了。
查看系统打开文件数量,使用命令:ulimit -a。
修改打开文件数量,修改成102400,命令:ulimit -n 102400。
查看修改后情况,使用命令:ulimit -n。

httpstat

httpstat是一个外部工具,可以使用 brew install httpstat 单独安装。

httpstat https://www.baidu.com

HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: keep-alive
Content-Length: 2443
Content-Type: text/html
Date: Sun, 22 Dec 2009 11:15:09 GMT
Etag: "588603eb-98b"
Last-Modified: Mon, 23 Jan 2009 13:23:55 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/

DNS Lookup   TCP Connection   TLS Handshake   Server Processing   Content Transfer
[    117ms   |      10ms      |     32ms      |       20ms        |        1ms       ]
             |                |               |                   |                  |
    namelookup:117ms          |               |                   |                  |
                        connect:127ms         |                   |                  |
                                    pretransfer:159ms             |                  |
                                                      starttransfer:179ms            |
                                                                                 total:180ms

httpstat 作用类似如下:

curl -s -o /dev/null -w "\ntime_namelookup: %{time_namelookup}\ntime_connect: %{time_connect}\ntime_appconnect: %{time_appconnect}\ntime_redirect: %{time_redirect}\ntime_pretransfer: %{time_pretransfer}\ntime_starttransfer: %{time_starttransfer}\n-----------------------------\ntime_total: %{time_total}\n" https://www.baidu.com