linux技术内幕相关工具使用

查看并修改网卡队列

#查看网卡接收队列ringbuffer最大长度限制和当前队列长度
ethtool -g ens33
#查看是否有丢包 如果ringbuffer满了 会丢弃数据包
ethtool -S ens33
#这两个结果如果大于0就说明有丢包
tx_fifo_errors:0
rx_fifo_errors:0
#调整ringbuffer大小 注意:如果调大 等待处理的时间会增加 不是解决丢包的根本方案 还是需要调整队列的数量来让cup均衡处理
ethtool -G ens33 rx 4096 tx 4096
#查看网卡队列数量
ethtool -l ens33
注意:不是所有网卡驱动都支持这个操作。如果你的网卡不支持,会看到如下类似的错误:
Channel parameters for eno2:
Cannot get device channel parameters
: Operation not supported
这意味着驱动没有实现 ethtool 的 get_channels 方法。可能的原因包括:该网卡不支持调整 RX queue 数量,不支持 RSS/multiqueue,或者驱动没有更新来支持此功能。

#加大网卡队列数量一遍让cup实现负载均衡 注:不是所有网卡都支持多队列旧版本网卡不支持
#如果网络io高 导致个别核si高 可以增加队列解决
ethtool -L ens33 combined 32

#另一种查看队列方式
ls /sys/class/net/ens33/queues
#查看该队列对应的中断号
cat /proc/interrupts
 19:         29          0     292068          0   IO-APIC-fasteoi   ens33
#启动网卡
ifconfig ens33 up
#关闭网卡
ifconfig ens33 down

服务器性能监控sar工具

#安装sar工具
yum install -y sysstat
#第一次使用需要创建文件2是间隔 10是次数
sar -o 2 10
#保存到test文件
sar -o test 1 3
#从文件中查看
sar -f test
#监控cpu 
sar -u 2 10
%user   用户空间的CPU使用
%nice   改变过优先级的进程的CPU使用率
%system   内核空间的CPU使用率
%iowait   CPU等待IO的百分比 
%steal   虚拟机的虚拟机CPU使用的CPU
%idle   空闲的CPU
#监控内存
sar -r 1 3
kbmemfree   空闲的物理内存大小
kbmemused   使用中的物理内存大小
%memused  物理内存使用率
kbbuffers  内核中作为缓冲区使用的物理内存大小,kbbuffers和kbcached:这两个值就是free命令中的buffer和cache. 
kbcached  缓存的文件大小
kbcommit   保证当前系统正常运行所需要的最小内存,即为了确保内存不溢出而需要的最少内存(物理内存+Swap分区)
commit   这个值是kbcommit与内存总量(物理内存+swap分区)的一个百分比的值

#查看平均负载
sar -q 1 3
runq-sz    运行队列的长度(等待运行的进程数,每核的CP不能超过3个)
plist-sz   进程列表中的进程(processes)和线程数(threads)的数量
ldavg-1  最后1分钟的CPU平均负载,即将多核CPU过去一分钟的负载相加再除以核心数得出的平均值,5分钟和15分钟以此类推
ldavg-5   最后5分钟的CPU平均负载
ldavg-15  最后15分钟的CPU平均负载
#查看网络收发包
sar -n DEV
IFACE  本地网卡接口的名称
rxpck/s  每秒钟接受的数据包
txpck/s  每秒钟发送的数据库
rxKB/S  每秒钟接受的数据包大小,单位为KB
txKB/S  每秒钟发送的数据包大小,单位为KB
rxcmp/s  每秒钟接受的压缩数据包
txcmp/s  每秒钟发送的压缩包
rxmcst/s  每秒钟接收的多播数据包    
#网络设备通信失败信息
sar -n EDEV
IFACE 网卡名称
rxerr/s  每秒钟接收到的损坏的数据包
txerr/s  每秒钟发送的数据包错误数
coll/s  当发送数据包时候,每秒钟发生的冲撞(collisions)数,这个是在半双工模式下才有
rxdrop/s  当由于缓冲区满的时候,网卡设备接收端每秒钟丢掉的网络包的数目
txdrop/s 当由于缓冲区满的时候,网络设备发送端每秒钟丢掉的网络包的数目
txcarr/s  当发送数据包的时候,每秒钟载波错误发生的次数
rxfram/s   在接收数据包的时候,每秒钟发生的帧对其错误的次数
rxfifo/s    在接收数据包的时候,每秒钟缓冲区溢出的错误发生的次数
txfifo/s    在发生数据包 的时候,每秒钟缓冲区溢出的错误发生的次数
#统计socket连接信息  
sar -n SOCK
totsck  当前被使用的socket总数
tcpsck  当前正在被使用的TCP的socket总数
udpsck   当前正在被使用的UDP的socket总数
rawsck  当前正在被使用于RAW的skcket总数
if-frag   当前的IP分片的数目
tcp-tw  TCP套接字中处于TIME-WAIT状态的连接数量

抓包工具tcpdump

#采集网卡ens33的包
tcpdump -i ens33 -X -c 3
-i 是interface的含义,是指我们有义务告诉tcpdump希望他去监听哪一个网卡
-X告诉tcpdump命令,需要把协议头和包内容都原原本本的显示出来(tcpdump会以16进制和ASCII的形式显示),这在进行协议分析时是绝对的利器。
port 1111我们只关心源端口或目的端口是1111的数据包.
-c 是Count的含义,这设置了我们希望tcpdump帮我们抓几个包
-l选项的作用就是将tcpdump的输出变为“行缓冲”方式,这样可以确保tcpdump遇到的内容一旦是换行符即将缓冲的内容输出到标准输出,以便于利用管道
参数–w  -r
-w 直接将包写入文件中(即原始包,如果使用 重定向 > 则只是保存显示的结果,而不是原始文件),即所谓的“流量保存”---就是把抓到的网络包能存储到磁盘上,
保存下来,为后续使用。参数-r 达到“流量回放”---就是把历史上的某一时间段的流量,重新模拟回放出来,用于流量分析。
或重定向方式来进行后续处理。
返回数据:
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on docker0, link-type EN10MB (Ethernet), capture size 262144 bytes
08:56:44.819431 IP 172.17.0.19.49110 > localhost.9503: Flags [P.], seq 1166822927:1166822982, ack 3559934662, win 1424, options [nop,nop,TS val 1644239550 ecr 1644229549], length 55
08:56:44.819484 IP 172.17.0.1.57238 > 172.17.0.17.27017: Flags [P.], seq 4259303388:4259303443, ack 4251121694, win 1424, options [nop,nop,TS val 1644239550 ecr 1644229549], length 55
08:56:44.819634 IP 172.17.0.17.27017 > 172.17.0.1.57238: Flags [P.], seq 1:225, ack 55, win 235, options [nop,nop,TS val 1644239550 ecr 1644239550], length 224
3 packets captured
6 packets received by filter
0 packets dropped by kernel
08:46:29.574542 分别对应着这个包被抓到的“时”、“分”、“秒”、“微妙”
length 148表示以太帧长度为148
172.17.0.1表示这个包的源IP为172.17.0.1源端口为57238,’>’表示数据包的传输方向, 172.17.0.17.27017,
表示这个数据包的目的端ip为172.17.0.17,目标端口为27017
Flags是[S],表明是syn建立连接包(即三次握手的第一次
握手),seq1166822927: 序号为1166822982,这个其实就是TCP三次握手的第一次握手:client(172.17.0.1)发送syn请求建立连接包。

查看每个cup接收和发送数据包数量

cat /proc/softirqs

查看本地路由表 如果ip在本地路由表里 则直接走loopback(lo)虚拟网卡
linux初始化时 会把所有本机网卡ip都加到本地网卡上 所以不管访问那个本机ip都是走lo虚拟网卡

#查看本地路由表
ip route list table local
#查看main路由表
route -n

测试发送的网络包走那个网卡

#监控服务器网卡lo的8888端口
tcpdump -i lo port 8888
#在启动个终端发送telnet数据包到本机ip
telnet 192.168.1.* 8888

strace是跟踪进程执行时的系统调用和所接收的信号(即它跟踪到一个进程产生的系统调用,包括参数、返回值、执行消耗的时间)

#查看进程创建连接connect的系统资源消耗
#-c统计每一系统调用的所执行的时间,次数和出错的次数等.
#-p pid 跟踪指定的进程pid
strace -cp 32334
#查看接收队列跟发送队列长度
ss -lnt
#查看网络统计信息
netstat -s
#查看全连接队列是否装满导致溢出
netstat -s | grep overflowed
#防止半连接队列溢出 直接设置tcp_syncookies值=1
cat /proc/sys/net/ipv4/tcp_syncookies
#监听网络状态 查看系统正在运行的内容
 ss -ant

查看cpu跟cpu绑定内存条

#查看cpu跟cpu绑定内存条
dmidecode
#查看zone信息
cat /proc/zoneinfo
#查看slab内存分配器
cat /proc/slabinfo
#按照slab占用内存排序
slabtop

修改进程最大打开文件数
需要修改三个文件
#系统级别设置 这个是整个系统打开的最大文件数
fs.file-max=1100000
#系统对进程的限制
fs.nr_open=1100000
#用户进程级别的线上 需要注意的是 此限制要小于上边系统级别的限制 否则登录不了
/etc/security/limits.conf

#首先查看进程限制的最大连接数 数字为进程号
cat /proc/25753/limits
#查看限制
sysctl -a |grep fs.file-max
sysctl -a |grep fs.nr_open
#修改限制
vi /etc/sysctl.conf
#增加:
fs.file-max=1100000
fs.nr_open=1100000
#保存并生效
sysctl -p
#修改用户进程限制
vi /etc/security/limits.conf
#或者修改 如果上下这两个文件都修改 以20-nproc.conf 这个文件为准
vi /etc/security/limits.d/20-nproc.conf
#增加如下配置
*       soft    nofile    65535
*       hard    nofile    65535
#退出终端从新进入即可生效 查看配置是否生效
#查看进程限制 如果没效果 则在修改如下两个文件
1.在/etc/rc.local 中增加一行 ulimit -SHn 65535
2.在/etc/profile 中增加一行 ulimit -SHn 65535
#刷新环境变量
source /etc/profile
#再试下
ulimit -a
cat /proc/25753/limits

查看当前系统建立的连接数

ss -n | grep ESTAB | wc -l

修改客户端可用端口范围 如果范围过小 发的请求多 会造成cup过载

#修改配置
vi /etc/sysctl.conf
#增加如下配置
net.ipv4.ip_local_port_range = 5000 65000
#生效
sysctl -p

修改全连接队列长度 默认128
注意:全连接队列是调用listen是传入的参数backlog以及内核参数net.core.somaxconn 二者之间较小的
想要生效 需要两个参数都改

#修改配置
vi /etc/sysctl.conf
#增加如下配置
net.core.somaxconn = 1024
#生效
sysctl -p

查看详细内存信息

cat /proc/meminfo

软中断bugget调整 调整ksoftirqd一次处理网络包数量 处理完这些 就会让出cup
如果想要内核提高处理网络包效率 可以增加这个值

#查看默认值
sysctl -a |grep net.core.netdev_budget
net.core.netdev_budget = 300
#修改值 重启失效
sysctl -w net.core.netdev_budget = 600
#重启有效需要写入配置文件
vi /etc/sysctl.conf
#生效
sysctl -p

接收合并处理 服务器频繁有大文件传输 开启LRO/GRO提高cup处理效率 把分发的包 合并成一个包 进行处理

#查看是否开启
ethtool -k eno1
generic-receive-offload: on
large-receive-offload: off
#如果没有打开 通过以下方式打开
ethtool -k eno1 gro on
ethtool -k eno1 lro on

veth设备对使用

#查看网卡信息
ip link show
#创建veth设备对
ip link add veth0 type veth peer name veth1
#为veth设备配置ip
ip addr add 192.168.11.1/24 dev veth0
ip addr add 192.168.11.2/24 dev veth1
#启动设备
ip link set veth0 up
ip link set veth1 up
#查看
ifconfig
#还需要关闭反向过滤rp_filter否则会被过滤掉,然后再打开accept_local接收本机ip数据包
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/veth0/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/veth1/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/veth0/accept_local 
echo 1 > /proc/sys/net/ipv4/conf/veth1/accept_local

使用网络命名空间来隔离网络并实现不同网络空间的网络通信

#查看本机所有netns
ip netns list
#创建新netns
ip netns add net1
#查看网络空间中的iptable 路由表 以及网络设备
ip netns exec net1 route
ip netns exec net1 iptables -L
ip netns exec net1 ip link list
#创建veth
ip link add veth1 type veth peer name veth1_p
#把veth1加入net1命名空间
ip link set veth1 netns net1
#查看效果 只看到veth1_p
ip link list
#查看net1空间
ip netns exec net1 ip link list
#添加ip
ip addr add 192.168.0.100/24 dev veth1_p
ip netns exec net1 ip addr add 192.168.0.101/24 dev veth1
#启动
ip link set dev veth1_p up
ip netns exec net1 ip link set dev veth1 up
#查看启动的网络设备
ifconfig
ip netns exec net1 ifconfig
#检测是否连通
ip netns exec net1 ping 192.168.0.100 -I veth1
ping 192.168.0.101 -I veth1_p

使用网桥bridge实现容器间互相通信

#创建命名空间
ip netns add net1
#创建一对veth
ip link add veth1 type veth  peer name veth1_p
#一端放入net1命名空间
ip link set veth1 netns net1
#配置ip 启动网卡
ip netns exec net1 ip addr add 192.168.0.101/24 dev veth1
ip netns exec net1 ip link set veth1 up
#查看配置是否成功 ifconfig 查看已启动的网络设备
ip netns exec net1 ifconfig
#重复上边步骤在创建个netns:net2
#创建网卡 veth2 veth2_p
#ip:192.168.0.102
#此时两个网络是独立的 互相不能通信 需要使用bridge连通
#安装bridge工具
yum install bridge-utils
#创建网桥
brctl addbr br0
#把veth网络设备另一端插入bridge 并被bridge分配ip
ip link set dev veth1_p master br0
ip link set dev veth2_p master br0
ip addr add 192.168.0.100/24 dev br0
#启动bridge veth1 veth2
ip link set veth1_p up
ip link set veth2_p up
ip link set br0 up
#查看网桥设备 看是否启动成功
brctl show
#连通测试
ip netns exec net1 ping 192.168.0.102 -I veth1

通过使用iptables nat实现容器与外部主机通信
使用上边创建的veth 和bridge 继续操作

#先测试容器访问外部网络
ip netns exec net1 ping 192.168.77.1
报错:网络不可达(connect:Network is unreachable)
这个错误说明路由表没配置
#查看路由
ip netns exec net1 route -n
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 veth1
#配置路由 增加默认路由
ip netns exec net1 route add default gw 192.168.0.1 veth1
#在重试 发现还是不通 但是不报之前错误 说明路由已经把请求发到bridge上
#首先开启linux转发配置 默认是关闭的 下边配置只是为了测试 退出终端就会失效 想永久生效 需要写入配置文件
sysctl net.ipv4.conf.all.forwarding=1
iptables -P FORWARD ACCEPT
#配置完成后还是不会生效 因为外网不认容器ip需要配置nat进行转发
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 ! -o br0 -j MASQUERADE
#再测试 发现已经能发送数据
ip netns exec net1 ping 192.168.77.1
#想要从外部服务器访问容器 需要容器绑定宿主机端口 类似 docker run -p 8080:81
iptables -t nat -A PREROUTING ! -i br0 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.0.101:81
#安装nc工具用于测试
yum -y install nc
#net1命名空间启动nc
ip netns exec net1 nc -lp 81
#外部服务器telnet 测试
telnet 宿主机ip:port

nc 工具的使用
nc是netcat的简写,是一个功能强大的网络工具,有着网络界的瑞士军刀美誉

#安装
yum install -y nc
#nc 能监听任意tuc udp 端口 用于测试 -l 监听端口
nc -l 555
#另一台机器 链接 可实现聊天
nc 192.168.*.* 555
#也可以使用telnet 测试
telnet 192.168.*.* 555
#检查服务器端口是否通
nc -zv ip port
#扫描端口
nc -v -w 1 10.0.0.* -z 55550-55555
#验证UDP端口
nc -uvz 10.248.24.98 55555
#如果需要快速实现两个局域网主机的文件cpoy,可以采用该方式指定UDP协议传输,传输速率可参考下文,我的笔记本传输速率大概为50M左右
nc -lp 55555 > recive.txt

你可能感兴趣的:(linux,服务器,网络)