此篇记录一下工作中常用的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求文件的交集、并集和差集
- 交集
sort a.txt b.txt | uniq -d
sort后面的参数,如 -n 表示按照数字格式排序,如 -i 表示忽略大小写,如-r 表示为逆序输出。
uniq为删除文件中重复的行,得到文件中唯一的行,参数 -d 表示的是输出出现次数大于1的内容,参数-u表示的是输出出现次数为1的内容。
- 并集
sort a.txt b.txt | uniq
- 差集
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