Skip to content

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
1
2
3
# 查看log文件
egrep -i -r 'killed process' /var/log
dmesg | grep -E 'kill|oom|out of memory'

查看进程里创建一个线程消耗虚存的大小

Bash
1
2
3
4
5
6
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
1
2
3
# 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等监测网卡负载

Bash
mpstat -P ALL

pidstat

查看进程的负载情况

Bash
pidstat -u 5

查看某进程占用内存

Bash
1
2
3
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了

  1. -c, --cpu N:产生N个进程,循环调用sqrt产生cpu压力
  2. -i, --io N:产生N个进程,循环调用sync将内存缓冲区写到磁盘上,产生io压力。如果缓冲区内数据较少,写到磁盘中的数据也较少,不会产生IO压力。 在SSD磁盘环境中尤为明显,很可能iowait总是0,却因为大量调用系统调用sync,导致系统CPU使用率sys 升高。
  3. -m, --vm N:产生N个进程,循环调用malloc/free进行内存分配和释放。(--vm-bytes B:指定分配内存大小;--vm-stride B:不断给部分内存赋值, 让COW发生;--vm-hang N:分配到内存的进程休眠N秒后,再释放内存;--vm-keep:一直占用内存)
  4. -d, --hdd N:产生N个不断执行write和unlink函数的进程(创建文件,写入内容,删除文件)。(--hdd-bytes B:指定文件大小)
  5. –hdd-noclean:不要将写入随机ASCII数据的文件Unlink
  6. -t, --timeout N:在N秒后结束程序
  7. –backoff N:等待N微秒后开始运行
  8. -q, --quiet:程序在运行的过程中不输出信息
  9. -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
1
2
3
4
5
6
7
8
9
# 丢弃来自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
1
2
3
4
# 性能统计
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
1
2
3
4
# 以MB查看
free -m
# 以GB查看
free -g

修改进程优先级

Bash
renice -n [number] [pid]

轮询调用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]

计数

Bash
ls | wc -l

grep

Bash
# 指定匹配
grep -E "[...]|[...]"
# 指定排除
grep -v "[...]\|[...]\|[...]"
# 输出上下文
# 显示前10行
grep -A 10
# 显示后10行
grep -B 10
# 显示前后10行
grep -C 10