Develop Skill
部署NTP同步时间
多机时间戳同步需要部署NTP服务器和客户端
服务端配置
Bash |
---|
| sudo apt install ntp ntpdate
# 修改配置文件
sudo vim /etc/ntp.conf
# 在末尾添加
restrict [server-ip] mask 255.255.255.0 nomodify
server 127.127.1.0
fudge 127.127.1.0 stratum 10
# 关闭防火墙(不清楚是否是必须的)
sudo ufw disable
# 重启ntp server
sudo service ntp restart
|
客户端配置
Bash |
---|
| # (客户端应该不需要安装ntp)
sudo apt install ntp ntpdate
# 修改配置文件
sudo vim /etc/ntp.conf
# 在末尾添加
server [server-ip] prefer
# 客户端同步服务端时间戳
sudo ntpdate [server-ip]
# 若上面命令报ntp is running,则先停止ntp sever,在执行ntpdate
sudo service ntp stop
# 客户端金庸systemd timesyncd服务
sudo timedatectl set-ntp off
|
永久配置ifconfig
局域网通信配置时有时需要写死ip,避免重复劳动
Bash |
---|
| # Ubuntu 20.04环境下
sudo vim /etc/netplan/01-network-manager-all.yaml
# 在network里添加
network:
ethernets:
ens33:
dhcp4: false
addresses: [169.254.102.8/16]
gateway4: 169.254.102.1
# nameservers:
# addresses: [1.1.1.1, 8.8.8.8]
# 然后在终端应用该配置文件
sudo netplan apply
# 或者在图形的设置里进行手动设置(类似windows)
|
查看是否是linux系统由于内存溢出杀死了进程
Bash |
---|
| # 查看log文件
egrep -i -r 'killed process' /var/log
dmesg | grep -E 'kill|oom|out of memory'
|
查看进程里创建一个线程消耗虚存的大小
Bash |
---|
| ulimit -a
# 输出结果里有个 stack size就是分配的默认栈大小,ubuntu22.04虚拟机分配的是8192kbytes即8M
# 查看系统支持的最大线程数
cat /proc/sys/kernel/threads-max
# 查看pid号数量,进程和线程都会消耗这个id号
cat /proc/sys/kernel/pid_max
|
查看cpu处理器是否为NUMA架构
Bash |
---|
| sudo apt install numactl
# 查看可用的内存节点信息与访问距离
numactl -H
# 查看numa内存分配策略:
# 主要有MPOL_BIND(必须绑定的节点,不足即swap)、MPOL_INTERLEAVE(本地和远程均可)
# MPOL_PREFERRED(优先指定节点,不择即选择离指定节点最近的节点)、MPOL_LOCAL(默认,优先本地,不足使用远程)
# 可通过 #include <numaif.h> 的 long set_mempolicy(int mode, const unsigned long* nodemask, unsigned long maxnode) 设置内存策略
numactl -s
# 查看各个numa节点的内存访问命中次数
numastat
# 通过numactl将进程绑定到特定的内存节点, 下面是内存分配在0号numa节点,进程numatest.out运行在1号numa节点
numactl --membind=0 --cpunodebind=1 ./numatest.out
|
按照进程名查看cpu占用等信息
Bash |
---|
| # sed -n '1p'是选择第一行,也可以用head -1代替
top -d 1 -p $(ps -ef | grep exe_name | awk '{print $2}' | sed -n '1p')
|
查看进程启动时间
Bash |
---|
| # etime : 以 hh:mm:ss形式出现
# etimes: 以秒为单位
ps -p [pid] -o etime
|
基准测试
sysbench压力测试,可用于测试cpu性能、内存负载、磁盘io、多线程调度等
查看cpu负载
uptime
查看系统平均负载
mpstat
查看各个cpu的负载,可以看到是否时io密集型(iowait为0则为cpu密集型)
dstat
查看total cpu、sidk、net、paging、system的负载
sar
sar -n DEV 1 10
/ sar -u 1
等监测网卡负载
pidstat
查看进程的负载情况
查看某进程占用内存
Bash |
---|
| cat /proc/[pid]/statm
# 会输出6个数据
# 48596 2208 1401 353 0 4980 0
|
各个数据的含义:(一页默认4KB)
statm |
meaning |
reference |
Size(pages) |
任务虚拟地址空间的大小 |
VmSize / 4 |
Resident(pages) |
应用程序正在使用的物理内存的大小 |
VmRSS / 4 |
Shared(pages) |
进程共享页数 |
|
Trs(pages) |
程序所拥有的可执行虚拟内存的大小 |
VmExe / 4 |
Lrs(pages) |
被映像到任务的虚拟内存空间库的大小 |
VmLib / 4 |
Drs(pages) |
程序数据段和用户态的栈大小 |
(VmData + VmStk) / 4 |
Dt(pages) |
脏页数量 |
|
stress
压力测试工具,升级版:stress-ng。兼容stress。不用另写c++ demo了
- -c, --cpu N:产生N个进程,循环调用sqrt产生cpu压力
- -i, --io N:产生N个进程,循环调用sync将内存缓冲区写到磁盘上,产生io压力。如果缓冲区内数据较少,写到磁盘中的数据也较少,不会产生IO压力。
在SSD磁盘环境中尤为明显,很可能iowait总是0,却因为大量调用系统调用sync,导致系统CPU使用率sys 升高。
- -m, --vm N:产生N个进程,循环调用malloc/free进行内存分配和释放。(--vm-bytes B:指定分配内存大小;--vm-stride B:不断给部分内存赋值,
让COW发生;--vm-hang N:分配到内存的进程休眠N秒后,再释放内存;--vm-keep:一直占用内存)
- -d, --hdd N:产生N个不断执行write和unlink函数的进程(创建文件,写入内容,删除文件)。(--hdd-bytes B:指定文件大小)
- –hdd-noclean:不要将写入随机ASCII数据的文件Unlink
- -t, --timeout N:在N秒后结束程序
- –backoff N:等待N微秒后开始运行
- -q, --quiet:程序在运行的过程中不输出信息
- -n, --dry-run:输出程序会做什么而并不实际执行相关的操作
Bash |
---|
| # 模拟1个worker调用sync刷新内存缓冲区write到磁盘
stress -i 1 --hdd 1 --timeout 600
# stress-ng命令举例
stress-ng [OPTION [ARG]]
# 产生2个worker做圆周率算法压力
stress-ng --cpu 2 --cpu-method pi
#产生2个worker迭代使用30多种不同的压力算法,包括pi, crc16, fft等
stress-ng --cpu 2 --cpu-method all
#产生2个worker调用socket相关函数产生压力
stress-ng --sock 2
#产生2个worker读取tsc产生压力
stress-ng --tsc 2
#stress-ng将压力指定到指定CPU上
stress-ng --sock 4 --taskset 0-1,3
|
iperf3
测试网络吞吐量(默认使用tcp协议)
Bash |
---|
| # server端, 监控间隔10s,端口为5201
iperf3 -s -i 10 -p 5201
# 客户端,测速时间5s,发送10个连接数,-R表示下载测试,-O忽略前4s的结果
iperf3 -c x.x.x.x -p 5201 -t 5 -P 10 -R -O 4
# 客户端 udp,执行20s,每5s执行一次,传输数据包5G, --get-server-output表示显示服务端信息
iperf3 -u -c x.x.x.x -p 5201 -t 20 -i 5 --get-server-output
# 客户端 传输数据包5G,每7s显示一次
iperf3 -c x.x.x.x -p 5201 -i 7 -n 5G
# 纯纯测速
# 服务端
iperf3 -s
# 客户端,以GB/s输出,无限制比特率
iperf3 -c server.ip -B client.ip -f G -b 0 [-u]
|
iptables
模拟丢包
Bash |
---|
| # 丢弃来自tcp,ip为192.168.1.4的包
iptables -A INPUT -p tcp -s 192.168.1.4 -j DROP
# 丢弃发送给192.168.1.4的tcp包
iptables -A OUTPUT -p tcp -d 192.168.1.4 -j DROP
# 列出iptables当前配置项, 显示序号
iptables -nvL --line-numbers
# 删除配置的规则,序号为OUTPUT的1
iptables -D OUTPUT 1
iptables -D INPUT 1
|
strace
很强大,记得用,跟踪系统调用执行时间、跟踪特定系统调用read、write等
tcpdump
抓包程序,常用的选项有
- -i 指定要捕获的目标网卡名,通过ifconfig获取,any表示捕获所有网卡
- -w 将捕获的包原始信息(不解析、也不输出)写入文件中,后跟文件名
- -vv 详细显示抓包信息
- -n不解析域名,直接显示ip;-nn不解析域名和端口。(不解析还会提高抓取效率)
- -s 0 tcpdump默认截取前96字节内容,写0表示截取报文全部内容
- host/src/dst过滤主机ip
- tcp 只抓取tcp包
- udp 同上
perf
统计c++程序各个函数运行时间和调用次数
Bash |
---|
| # 性能统计
perf record -e cpu-clock ./test
# 分析报告
perf report
|
进一步可以生成火焰图,使用步骤
Bash |
---|
| # perf 记录信息
sudo perf record -F 99 -a -g ./a.out
sudo perf script > out.perf
./stackcollapse-perf.pl out.perf > out.folded
./flamegraph.pl out.folded > kernel.svg
# 最终使用游览器打开kernel.svg
## 好看的top
```sh
sudo apt install htop
|
系统检测工具
- tcpdump: 网络抓包
- lsof:列出所有打开的fd
- nc:可用于快速模拟网络客户端、服务端对网络数据发送接收的处理,进行调试
- strace:用于跟踪程序运行的系统调用和接受的信号
- netstat:网络连接、路由等信息
- ss: 与netstat差不多,但性能比netstat好
- vmstat/ifstat/mpstat
查看系统内存
Bash |
---|
| # 以MB查看
free -m
# 以GB查看
free -g
|
修改进程优先级
轮询调用shell命令
Bash |
---|
| # 终端命令行轮询查看状态命令(while do):
while true; do top -d 1 -p [pid]; sleep 1; done
|
addr2line
根据cppcrash栈信息,定位对应so或可执行程序的行数(编译时加-g)
Bash |
---|
| addr2line -C -f -e [.so/.exe/.out file] [crash pc]
|
c++filt
分析c++ 编译出的晦涩难懂的名称
Bash |
---|
| c++filt [eg: _ZN5RkCam10CamHwIsp2020clearStaticCamHwInfoEv]
|
计数
grep
Bash |
---|
| # 指定匹配
grep -E "[...]|[...]"
# 指定排除
grep -v "[...]\|[...]\|[...]"
# 输出上下文
# 显示前10行
grep -A 10
# 显示后10行
grep -B 10
# 显示前后10行
grep -C 10
|