golang是google推出的一种新型编程语言,拥有语法简单(类c,上手快),静态强类型(不易引入bug),编译型(执行速度快),并发型(充分利用多核),垃圾回收(减少对内存维护的代价)等优秀特性。本文主要说明安装及vscode配置相关内容。
python scapy
scapy主要优势在于丰富的协议数据包构造。原理为基于libpcap(windows上是winpcap/npcap)提供的一个python接口。本文主要以dns协议为例,说明scapy的使用。
DPDK分片与重组
DPDK版本:16.11.2,默认支持对大报文的分片和组装,但编码过程中仍需要关注几个地方,否则会陷入单步调试的泥沼不能自拔。
注意点:
- mbuf中的packet_type有可能并未被网卡填充,不能直接使用;
- reassemble接口中frag_tbl和death_row,不是线程安全的,不支持并发访问;
- mbuf库中只有read链表的操作,没有write链表的操作,所以需要自己实现;
- fragment接口参数中必须保证分片大小为8的整数倍;
- fragment前udp校验和的计算可参考dpdk checksum;
- fragment后ipv4校验和如果自己计算的话,需要重置掉offload标志;
- fragment后要free掉原始的mbuf,否则send后会出现mbuf泄漏;
protobuf for c
protobuf是google提供的一种数据序列化、反序列化工具,支持变长编码(数据压缩)、向后兼容(方便升级)、平台无关(方便移植)、语言无关(前后台解耦)等优秀特性。可用于数据存储、网络数据交互等场景。本文主要介绍protobuf在c语言编程中的安装步骤。
protobuf安装包主要包括两部分:代码生成器(处理.proto) + 运行时库。
c: 由于官方主代码库不提供c库,需要安装第三方库(插件形式)。
c++/java/go/c#/python/js/object-c/ruby/php/dart: 均可使用官方库安装。
交换机bgp配置
BGP(Border Gateway Protocol),即边际网关协议,主要用于AS(autonomous system)之间的路由信息交换(EBGP),也可用于大型的AS内部(IBGP)。提供BGP服务的实体叫做BGP router,而与BGP router连接的对端叫做BGP peer。推荐阅读BGP漫谈。本文主要讲解基于华为三层交换机[H3C S5830V2]的配置方法。
交换机端口聚合配置
端口聚合,又称为链路聚合,就是将物理上的多个端口配置到一起,形成逻辑上的一个端口,使之具有:增大带宽、负载均衡、冗余链路的优点。下面以华为三层交换机[H3C S5830V2]为例,说明端口聚合的配置过程。
dpdk checksum
版本:16.11.2,当解析或组装ip/icmp/icmpv6/igmp/udp/tcp/sctp报文时,会发现都存在两个字节(16位)的checksum字段,其生成及校验算法相同。实现方式有两种:1,软件方式计算;2,offload到网卡计算。本文主要介绍软件计算方法及dpdk中的实现。
注意:当代码中设置了offload标志后,就不能使用软件方法计算,否则校验和重复计算会导致错误,因为硬件计算时校验和字段不为0。
kvm
kvm是linux内核提供的基于硬件辅助的虚拟化实现方案,主要组件包括:内核态(kvm.ko/kvm_inter.ko/kvm_amd.ko)及用户态(qemu)。关于kvm原理,推荐阅读KVM 虚拟化详解。本文主要提供kvm+centos7.2的安装过程。
Docker
docker是一种轻量级的虚拟化技术,用go语言实现,充分利用了linux的cgroups/namespaces/UnionFS三大技术,解决了开发环境和生产环境环境不一致和资源共享的问题。
Windows VirtualBox
VirtualBox是一款开源的虚拟机软件,支持windows/linux/mac等多个系统。
ip
ip命令是用于显示和配置网络设备、路由、策略路由及隧道。
语法:ip [ OPTIONS ] OBJECT { COMMAND | help }
与ifconfig区别:
1.安装方式不同
ifconfig:yum install net-tools
ip:yum install iproute
2.实现原理不同
ifconfig:通过procfs(/proc)和ioctl系统调用去访问和改变内核网络配置;
ip:通过netlink套接字接口与内核通讯,完成增删改查;
3.使用方式不同
net-tools:通过ifconfig/arp/route/netstat等多个命令操作地址、路由等信息;
iproute2:通过单个ip命令及统一的格式即可完成ip、路由等的操作;
tshark
tshark是wireshark的命令行工具,同tcpdump一样,可通过libpcap抓取/过滤/保存网卡报文,处理速度低于tcpdump,但支持的协议更加丰富。
重点参数:
-f : 抓包过滤(capture filter) https://tshark.dev/capture/capture_filters/
-Y/-R : 显示过滤(display filter) https://tshark.dev/analyze/packet_hunting/packet_hunting/
journalctl
journalctl用于读取systemd-journalctld.service服务抓取的系统及应用的日志,默认日志只存储于内存中/run/log/journal中,服务器重启后丢失;如果需要持久化到硬盘,需要手工创建/var/log/journal文件夹。
journald及syslogd都是用于收集系统日志的后台进程,linux系统都会默认安装,syslogd起源于init.d,而journald是随systemd的流行开始的。
主要区别如下:
1.journald的日志文件格式为二进制,不能直接读取(使用journalctl),而syslogd是纯文本的,方便阅读;
2.journald的日志文件存在索引、结构化、访问控制等特点,访问速度更快;
3.journald默认日志路径/run/log/journal(内存),而syslogd默认/var/log/(硬盘);
相同点如下:
1.都能用于收集系统及应用日志;
2.都能将日志传输到远端的独立日志服务器方便处理;
两者的关系如下:
1.journald提供了一个syslog api可以将日志发送给syslogd;
2.syslogd同样也提供了插件可以读取和写入journald;
推荐阅读:Tutorial: Logging with journald
vscode gdb
当使用gdb调试应用时,如果需要执行vscode不支持的一些gdb命令,需要用到-exec命令,如查看内存。先决条件:代码编译时增加-g或-ggdb选项,如果要包含宏定义,需要-g3/-ggdb3级别。
-g: 该选项可以利用操作系统的“原生格式(native format)”生成调试信息。GDB 可以直接利用这个信息,其它调试器也可以使用这个调试信息。
-ggdb: 使 GCC为GDB 生成专用的更为丰富的调试信息,但是,此时就不能用其他的调试器来进行调试了 (如 ddx)。
vscode远程调试
当开发linux应用时,一般的开发环境配置为:windows上完成编码,linux上完成编译加调试。但此种配置时,需要频繁的windows<=====>linux之间切换,对工作效率影响极大。vscode的debug特性完美的解决了这个问题,同时支持launch(启动调试)和attach(挂载调试)。
dpdk大页内存
DPDK使用大页内存技术来提高系统性能,因为大页内存有以下两个特点:
- hugepage 这种页面不受虚拟内存管理影响,不会被替换出内存。
- 同样的内存大小,hugepage产生的页表项数目远少于4kpage,这样就有效的增加了TLB的命中率。
awk
awk是一个基于行的解释型的编程语言,主要用于文本分析及格式化输出。建议阅读文档AWK工作原理,AWK官方手册。
基本语法如下:
1 | |
其中:
单引号(‘’):避免shell对命令行转义,建议阅读shell引号问题;
BEGIN{commands} : 读输入文件之前执行的代码段,可选;
END{ commands }:读输入文件之后的代码段,可选;
pattern{ commands }:针对每一行的匹配pattern(支持正则),成功则执行commands;可以配置多组pattern{commands};
Joplin
Joplin是一款开源的笔记类软件,支持Windows, macOS, Linux, Android and iOS等多种客户端。本文提供一套自有且完全开源的笔记系统的搭建过程,基于wsgidav作为服务端,提供同步功能;joplin作为客户端,提供编辑及浏览功能。
git 基础命令
git是2005年linus花了2周时间,用c语言开发的一款分布式版本控制系统,推荐参考https://www.liaoxuefeng.com/wiki/896043488029600。
git lfs
git rebase
当一个功能分支开发完毕后,一般会有若干次的编译问题,优化问题及代码调整问题的提交,而这些提交没有必要体现在主干分支的log里面,为了保持主干分支log的简洁性,有必要提前合并一下,然后再merge到主干。
git debug
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为例。