本文章来自我的微信个人技术公众号—网络技术修炼,公众号中总结普及网络基础知识,包括基础原理、网络方案、开发经验和问题定位案例等,欢迎关注。
Linux网络开发者面临的问题往往比较复杂,因此需要使用一些工具和命令来进行定位和解决。在本篇博客中,我将总结一些常用的Linux网络开发者工具和命令,包括网络包观测、各层网络状况快速诊断、网络关键统计计数收集、性能诊断、问题复现等方面的命令总结。
分类 | 命令、工具 | 作用 | 备注 |
包观测 | tcpdump | 用于抓取网络数据包。通过tcpdump命令可以捕获网络数据包,并进行分析和诊断。 | |
wireshark&&tshark | 分析网络数据包。 | wireshark可视化分析,tshark命令行分析。 | |
tcpflow | 用于抓取TCP流量并保存到文件。通过tcpflow命令可以捕获TCP流量,并将每个TCP连接的数据保存到不同的文件中。 | 比如可以快速将每个连接的包分发到不同文件保存。 | |
ngrep | 用于过滤和显示网络数据包。通过ngrep命令可以过滤和显示满足特定条件的数据包。 | 比如快速过滤http GET和POST请求。 | |
快速验证各层网络情况 | ping | 用于测试主机之间是否能够互相通信。通过向目标主机发送ICMP报文,可以确定网络连接是否正常。 | 检查ip层是否ok。 |
telnet | 用于远程登录和测试网络服务。通过telnet命令可以远程登录主机、测试网络服务是否可用,并进行交互式操作。 | 检查tcp握手是否ok。 | |
curl | 用于从命令行发送HTTP请求。通过curl命令可以发送GET、POST等HTTP请求,并查看服务器返回的响应。 | 检查http是否ok。 | |
openssl | OpenSSL是一个常用的加密工具库,可以用来实现SSL/TLS通信、数字证书签发和管理、密码学算法等功能。 | 检查ssl握手情况,证书内容等。 | |
网络路径状况查看 | traceroute | 用于确定数据包从一个主机到另一个主机所经过的路由路径。 | |
mtr | 用于网络故障定位和性能分析。mtr命令可以连续发送ICMP报文,并在每一跳的路由器上进行网络延迟和丢包率的统计,用于找出网络故障的根源。 | ||
网络状态和计数查看 | netstat | 用于查看网络连接、路由表、网络接口状态等信息。通过netstat命令可以了解当前系统的网络状况。 | |
ss | ss命令是netstat的替代品,用于查看网络连接状态、监听端口、网络接口等信息。与netstat不同的是,ss命令提供了更快的速度和更多的选项。 | ||
ifconfig | 用于查看和配置网络接口。通过ifconfig命令可以查看网络接口的IP地址、MAC地址、网络状态等信息。 | ||
ip | 配置和管理网络接口、路由表、ARP缓存和其他网络相关的属性。 | ||
curl cip.cc | 查看网络出口地址。 | ||
ethtool | 用于查看和配置网络接口的驱动程序。通过ethtool命令可以查看网络接口的状态、速度、双工模式等信息,并进行网络性能调优。 | ||
iftop | 用于实时监控网络流量。iftop命令可以显示每个网络接口的实时流量、连接数、连接速度等信息,用于快速诊断网络瓶颈和流量异常。 | ||
nethogs | 用于查看进程占用的网络带宽。通过nethogs命令可以查看每个进程占用的网络带宽、连接数和流量等信息,用于找出网络资源占用高的进程。 | ||
dns相关 | nslookup | 用于查询DNS服务器上的主机名和IP地址信息。通过nslookup命令可以查看主机名对应的IP地址、反向DNS解析等信息。 | |
dig | 查询DNS服务器上的主机名和IP地址信息。与nslookup不同的是,dig命令提供了更多的选项和功能。 | ||
系统异常查看 | dmesg | 用于查看内核日志。通过dmesg命令可以查看系统内核的日志信息,包括硬件检测、设备驱动加载等信息,用于排查和分析系统硬件和驱动问题。 | 比如oom、segment fault都可以在这里面看到相应的记录。 |
systemctl | 用于管理systemd服务。通过systemctl命令可以启动、停止、重启和查询systemd服务的状态,用于排查和处理系统服务异常问题。 | ||
journalctl | 用于查看系统日志。通过journalctl命令可以查看系统日志、过滤日志信息、按时间戳或者进程名等条件搜索日志信息,用于排查和分析系统异常和错误。 | ||
内存异常 | valgrind | 检查程序在运行时的内存访问错误、泄漏等问题。 | 无需修改代码 |
asan | 可以检测常见的内存安全问题,例如缓冲区溢出、使用未初始化的内存等。 | ||
性能定位 | top | 实时监控系统CPU、内存、进程等资源的使用情况,用于找出系统资源占用高的进程。 | 看出是用户态高还是内核态高,是否是io高等。 |
vmstat | 用于显示系统虚拟内存(VM)的使用情况。它提供了对系统内存、进程、CPU等性能数据的实时监控。 | 可快速看出上下文切换次数。 | |
pidstat | 进程级别统计cpu、io、上下文切换等信息。 | 看出上下文切换中自愿切换和非自愿切换次数。 | |
sar | 监测CPU使用率、磁盘I/O、网络流量、内存使用情况、进程活动等多个方面的数据,并将这些数据保存到本地或远程系统中,以供后续分析和处理。 | 可快速统计流量。 | |
perf | 可以用于测量和分析系统各个方面的性能数据,包括CPU、内存、磁盘、网络等方面的数据。 | cpu采样一把好手,看哪些函数是高频出现。还可以结合其他工具生成火焰图。 | |
pprof | 用于分析Go应用程序性能的工具,可以分析CPU、内存和代码分布等方面的性能问题。 | go语言专用更强大的采样工具。 | |
strace | 用于跟踪进程的系统调用和信号。 | ||
bpftrace | 动态跟踪工具,它使用BPF(Berkeley Packet Filter)技术来实现高效的内核和用户空间跟踪功能。 | 比如打印某个函数的系统调用栈和用户空间调用栈。脚本的方式使用ebpf工具。 | |
bcc | 基于BPF(Berkeley Packet Filter)技术的动态跟踪和性能分析工具集,主要用于Linux系统的内核和用户空间程序分析。 | 比bpftrace更灵活。 | |
网络场景构造 | iptables | 用于设置和管理Linux内核的防火墙。通过iptables命令可以设置网络连接的规则、过滤数据包、进行网络地址转换等操作。 | 可以对特定特征进行丢包,转换。 |
tc | 流量控制、网络流量调度和队列管理的工具,可用于实现各种QoS(Quality of Service)和网络流量控制功能 | 比如对特定流量增加丢包率、时延等。 | |
postman | 一款流行的API测试工具,可以帮助开发人员快速创建、测试、调试和共享API。 | ||
流量复制和重放 | goreplay | 一个HTTP实时流量复制工具。支持流量的放大、缩小,频率限制,还支持把请求记录到文件,方便回放和分析,也支持和ElasticSearch集成。 | |
tcpreplay | 一种pcap包的重放工具,它可以将用ethreal、wireshark工具抓下来的包原样或经过任意修改后重放回去。它允许你对报文做任意的修改指定重放报文的速度等,这样tcpreplay就可以用来复现抓包的情景以定位bug,以极快的速度重放从而实现压力测试。 | ||
tcpcopy | 一种请求复制工具,通过复制在线数据包,修改TCP/IP头部信息,发送给测试服务器,达到欺骗测试服务器的TCP程序的目的。 | ||
性能压测 | iperf | 用于测试网络带宽和性能。通过iperf命令可以在两个主机之间进行带宽测试和性能测试,用于评估网络的实际性能。 | 适合传输层压测、带宽压测等场景。 |
ApacheBench (ab) | 一个基于Apache HTTP服务器的性能测试工具,用于测试Web服务器的负载能力 | 适合应用层压测。 | |
wrk | 一个高性能的HTTP压力测试工具,支持多线程和支持Lua脚本扩展。 | ||
stress | 一个简单但功能强大的Linux压力测试工具,可以测试CPU、内存、I/O、网络等方面的性能。 |
在我的公众号中有一篇文章—怎样进行问题定位,总结了开发者定位问题的方法论。熟悉工具和命令只能帮我们快速收集信息和对假设做出验证。除了熟悉工具,更重要的是具备过硬的基础知识、熟悉代码流程,并懂什么时候收集什么信息,然后将这些命令和工具熟练的应用到工作中。欢迎关注我的个人技术公众号: