git传输协议支持http(如:https://github.com/zhaotao19860/mem-monitor.git)和ssh(如:git@github.com:zhaotao19860/mem-monitor.git)两种方式,因为我开发过程中主要使用ssh传输协议,所以下面以ssh协议为例分析如何调试。git运行包括两部分ssh连接+git命令运行(本机部分+远端部分),所以调试也分两部分。
dpdk 16.11.2 upgrade to 19.11.5
刚开始开发时使用的是dpdk16.11.2,后面开发过程中需要用到新版本的特性,比如flow director、新版本Mellanox驱动、更好的性能(无锁hash表)等,所以需要升级dpdk,选择比较新的版本dpdk19.11.5。
dpdk 19.11.5 install
dpdk的安装基本使用dpdk-setup.sh一个脚本就搞定了。如果需要1G的大页内存,需要事先手动调用脚本hugepage_set.sh。如果需要隔离cpu,也需要事先手动调用脚本cpu_isolation.sh。
dpdk debug
版本:19.11.5,当引用dpdk相关功能出错时,需要dpdk提供详细的出错信息或gdb调试的能力,以librte_ip_frag库为例。
pclint
pclint提供c/c++的静态代码检查功能,不需要编译,检查变量定义问题及代码逻辑问题,是一款优秀的商业软件。
kswapd0
线上某台服务器频繁告警,调用python->dircmp获取变化的文件时,返回超过20秒,增加打印日志发现是cmp函数返回慢。 因为cmp函数需要比较文件内容,需要大量内存,同时top发现kswap0一直运行且cpu占用100%,但通过free命令查看内存, swap分区基本没有使用,初步判定是系统内核自动使用了swap,需要调整系统参数。
AddressSanitizer
AddressSanitizer(地址杀菌剂,简称 ASan) 是谷歌出品的内存检查工具,可以诊断内存越界,
非法访问,内存泄漏,内存double free等常见内存问题,并且效率比valgrind高好几倍,可以克服valgrind的一些问题,比如占用内存高的问题。
gcc 4.8 开始,AddressSanitizer 成为 gcc 的一部分,但不支持符号信息,无法显示出问题的函数和行数。
从 4.9 开始,gcc 支持 AddressSanitizer 的所有功能。
Github 地址:https://github.com/google/sanitizers。
Wiki 地址:https://github.com/google/sanitizers/wiki/AddressSanitizer。
scan-build
用于编译时静态代码调用链检测,属于clang工具箱,需要注意的是没有编译的文件是不会检查的。
dpdk-as-lib
当把dpdk作为第三方库使用时,makefile该怎么写呢?当自己的代码是c++的时候该怎么改呢? 以下使用dpdk-stable-16.11.2/examples/ip_reassembly为例。
soa
Start Of Authortive Record(缩写soa)属于DNS的一种记录类型,包含本zone的控制及管理信息, 主要用于主授权与辅授权之间的zone同步,soa记录格式说明参见 RFC 1035。
social icons
博客中社交图标(social icons)通常用来表示链接一些网站的logo,使界面简洁好看,比如github/qq/email等,下面从获取到配置到使用给出了基于jeckll的详细配置,并提供了将svg图标缩小和竖排改为横排的方法。
jekyll
pdump
类似与tcpdump,可将dpdk的收发报文保存为pcap文件格式。 收包:网卡–>DMA–>rx_ring–>rx_burst–>rx_pkt_burst–>pdump_callback–>app; 发包:app–>tx_burst–>pdump_callback–>tx_pkt_burst–>tx_ring–>DMA–>网卡。
filecmp
Python2.3以上的版本默认自带了filecmp模块,无需额外安装。我们可以用这个模块来检查原式与目标文件的一致性, filecmp可以实现文件、目录、遍历子目录的差异对比功能。