-
which 命令
which + 可执行文件 ,用来查找它的路径和存放的地方。
which python /usr/bin/python
-
time 命令
统计一个命令或者可执行文件执行的时间。
time a.out
real 0m2.753s user 0m0.000s sys 0m0.000s
-
tcpdump 命令
-
ps 命令
ps -aux # 我常用的 ps -T -p pid # ps查看线程
-
find 命令
经常的需求就是,比如说要寻找home目录下面某个文件或文件夹。
find <指定目录> <指定条件> <指定动作>
$find . -name 'my*' # 查找当前目录下面的,名字前缀是my开头的文件或文件夹 $find . -name 'my*' -ls # 搜索当前目录中,所有文件名以my开头的文件,并显示它们的详细信息。 $find . -name '*.cpp' -ls # 搜索当前目录中,以cpp结尾的文件,并显示它们的详细信息。
但是,find有一个问题就在文件比较多的时候,很慢。 这个时候locate命令就会更好一点了。
locate ~/code/*.cpp # 查找~/code目录下面 以cpp结尾的文件
-
grep 命令
查找当前文件夹下面,包含iostream字符串的文件。
grep -rn "iostream"
在服务器上面远程的看日志
# 查看xxx.log文件里面的ERROR grep ERROR xxx.log # 查看这个目录下面所有文件的error grep ERROR * # 查看这个目录下面所有文件的error,但是排除掉 tcp error grep ERROR * | grep -iv "tcp_error"
-
du 查看占用磁盘的大小
du -h --max-depth=1
-
sz / rz 命令
sz 从服务器上面下载一个文件
rz 上传一个文件给服务器
这个命令很适合使用xshell或crt的人,真的很方便。
-
scp 命令
-
GDB 调试
run + 参数 #开始 break #断点 next #下一行 step #单步进入 continue #跳到下一个断点 bt #查看函数栈 watch var # 查看某个变量,一个变量值发生变化时,程序会中断 call test_func(val) # test_func 是用户写的函数,gdb手动去执行这个程序 p/x var # p/x 把var变量以十六进制表示 info local # 显示当前函数中的局部变量信息
-
attach
gdb attach 进程号
-
处理corefile
gdb a.out core.xxxx
-
调试多进程
方式1:
gdb attach 进程号
方式2:使用follow-fork-mode
(gdb) set follow-fork-mode child # 表示调试子进程 (gdb) set follow-fork-mode parent # 表示调试子进程
-
调试多线程
info threads # 查看线程信息 set scheduler-locking on # 锁定线程 thread 2 # 选择要调试的线程
-
推荐一个教程
常用的参数
-c # 生成 .o 目标文件 , 不进行连接操作
-s # 生成汇编代码 gcc -S test.i -o test.s
-E # 预处理 gcc -E test.c -o test.i
-Wall # 显示警告信息
-Werror # error的时候,停止编译
-lpthread
-I # 指定头文件搜索的目录
gcc –c –I /usr/dev/mysql/include test.c –o test.o
-L #-L -l 指定了链接静态库或者是动态库的路径
-l
gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test
静态库链接时搜索路径顺序:
1. ld会去找GCC命令中的参数-L
2. 再找gcc的环境变量LIBRARY_PATH
3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的
动态链接时、执行时搜索路径顺序:
1. 编译目标代码时指定的动态库搜索路径
2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径
4. 默认的动态库搜索路径/lib
5. 默认的动态库搜索路径/usr/lib
有关环境变量:
LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径
LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径
segment fault的时候设置产生core文件
ulimit -a #查看core 是否可以产生
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7823
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) 7823
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
上面可以看出core file的大小是 0
ulimit -c 1024 # 修改成1024,这样就可以产生core file了
top的一部分输出是:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 8304 132 104 S 0.0 0.0 0:00.06 init
3 root 20 0 8304 92 56 S 0.0 0.0 0:00.00 init
VIRT 的定义是:
占用的虚拟内存的大小(占用的物理内存+swap空间)
virt是virtual memory usage ,virt是virtual的前四个字母的缩写吧。
virt表示的是申请到的内存,而不是使用的内存。(假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量)
RES 表示的是:占用的物理内存
进程常驻内存的大小,实际使用的物理内存
SHR 表示的是:占用的是共享内存
关于cpu利用率中一栏的内容:
1.3% us — 用户空间占用CPU的百分比。
1.0% sy — 内核空间占用CPU的百分比。
0.0% ni — 改变过优先级的进程占用CPU的百分比
97.3% id — 空闲CPU百分比
0.0% wa — IO等待占用CPU的百分比(wait io)
0.3% hi — 硬中断(Hardware IRQ)占用CPU的百分比
0.0% si — 软中断(Software Interrupts)占用CPU的百分比
mpstat是Multiprocessor Statistics的缩写,是实时系统监控工具。
# 使用
mpstat -P ALL 5 3 # 查看所有的cpu的状态,每个5s输出一次,连续输出三次
# 解释
mpstat [-P {|ALL}] [internal [count]]
-P {|ALL} 表示监控哪个CPU, cpu在[0,cpu个数-1]中取值
internal 相邻的两次采样的间隔时间、
count 采样的次数,count只能和delay一起使用
# 对应的输出
11时01分59秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11时02分04秒 all 0.03 0.00 0.03 0.03 0.00 0.00 0.00 0.00 0.00 99.92
11时02分04秒 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11时02分04秒 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11时02分04秒 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11时02分04秒 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11时02分04秒 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11时02分04秒 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11时02分04秒 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
11时02分04秒 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
平均时间: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
平均时间: all 0.02 0.00 0.07 0.02 0.00 0.00 0.00 0.00 0.00 99.90
平均时间: 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
平均时间: 1 0.00 0.00 0.07 0.13 0.00 0.00 0.00 0.00 0.00 99.80
平均时间: 2 0.00 0.00 0.07 0.00 0.00 0.00 0.00 0.00 0.00 99.93
平均时间: 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
平均时间: 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
平均时间: 5 0.00 0.00 0.13 0.00 0.00 0.00 0.00 0.00 0.00 99.87
平均时间: 6 0.07 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.73
平均时间: 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
# 解释
%usr 在internal时间段里,用户态的CPU时间(%)
%nice 在internal时间段里,nice值为负进程的CPU时间(%)
%sys 在internal时间段里,核心时间(%)
%iowait 在internal时间段里,硬盘IO等待时间(%)
%irq 在internal时间段里,硬中断时间(%)
%soft 在internal时间段里,软中断时间(%)
%steal 显示虚拟机管理器在服务另一个虚拟处理器时虚拟CPU处在非自愿等待下花费时间的百分比
%guest 显示运行虚拟处理器时CPU花费时间的百分比
%gnice
%idle 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%)
对操作系统的虚拟内存、进程、CPU活动进行监控
vmstat 5 3 #采样间隔5s,采样次数2次
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 10412656 1056828 3802120 0 0 0 0 0 0 1 1 99 0 0
r表示正在运行的进程的数量
b表示被阻塞的进程的数量
关于system里面的两个参数:
in 表示的是 interrupt 中断数
cs 表示的是 content switch 上下文切换
cpu的里面的参数:
us 表示 user time ,用户态占用的cpu时间
sy 表示 system time,内核态占用的cpu时间
id 表示 idle tiem,闲置的时间
wa 表示 等待IO时间
pidstat 默认显示了所有进程的cpu,内存,io的使用率。
pidstat -u #查看进程的cpu 使用率
pidstat -r #查看进程的内存使用率
pidstat -d #查看进程的io 使用率
# 监控某一个具体的进程
pidstat -p 2350 -u 1 #查看进程id是2350的进程的情况,频率是1秒
pidstat -u -r -p 2350 1 10 #查看进程id是2350的进程的情况,频率是1秒
pidstat -t -p 2831 #查看多线程
pidstat -u 1 # 每秒1次的频率输出
我经常用的就是
netstat -atunlp
跟踪系统运行的过程中,执行的系统调用和信号。这个简直就是debug的神器呀。
比如说,写了一个tcp的程序,然后程序运行之后阻塞在一个地方,可以用这个命令来查看。
strace ./a.out -l 5003
strace ./netcat -l 5003
execve("./netcat", ["./netcat", "-l", "5003"], [/* 17 vars */]) = 0
brk(NULL) = 0x97a000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
...
futex(0x7f9adebcf1ac, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x7f9adebcf1b8, FUTEX_WAKE_PRIVATE, 2147483647) = 0
socket(PF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_TCP) = 3
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
bind(3, {sa_family=AF_INET, sin_port=htons(5003), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(3, 128) = 0
accept(3,
说明程序阻塞在了accept上面。当然,这个用gdb也可以实现。
分析性能问题的一个神器。
# -g 参数表示记录
sudo perf top -g -p pid
从perf的输出可以看出,在那些函数执行的时间是比较长的,这样可以帮助对性能问题,进行相关的分析。
```
nc -l 12345 #监听12345端口
```
```
nc 127.0.0.1 12345 #向12345端口建立连接
```