1 简介
BEK内核(BigCloud Enterprise Kernel,简称BEK内核),是BC-Linux操作系统团队基于社区长期支持版(LTS)内核,倾力打造的一款高性能、高稳定内核产品,满足对服务器操作系统稳定性、安全性、高性能等方面的需求,为操作系统上层应用提供了多种功能增强和性能优化,适合部署和搭建各种企业级应用服务。BEK内核已经默认集成在BC-Linux操作系统中,用户可根据需要选择使用,抢鲜体验社区高版本内核的特色功能。
2 功能及优势
BEK内核为用户提供内核社区最新增强功能,在文件系统、网络、Cgroup、KVM虚拟化等子系统上增加了大量适用于容器及云应用场景的新特性、性能优化和安全漏洞修复,目前已经发布了多个版本,包括:- 2017年5月,容器定制版1.0发布,定制研发了4.9.6版本BEK内核,默认加载支持Overlay2文件系统驱动,为Docker大幅提升了存储IO性能;
- 2017年10月,容器定制版1.1发布,BEK内核首次引进支持内核热补丁技术,并增加自研补丁以支持Namespace内核参数设定,可以在容器内进行网络调优,另外还修复了大量CVE安全漏洞;
- 2018年8月,BC-Linux 7.4发布,定制研发了4.9.82版本BEK内核,默认修复了Intel CPU“熔断”及”幽灵“漏洞,新增支持Google的TCP BBR拥塞控制算法,TCP Fastopen,IPv6 VXLAN等新特性;
- 2019年1月,BC-Linux 7.5发布,定制研发了4.14.78版本BEK内核,新增支持socket“零拷贝”机制,BFQ及Kyber两种IO调度器,virit-net默认开启了多队列特性,Cgroupv2支持线程模式等;
- 2019年5月,BC-Linux 7.6发布,定制研发了4.19.25版本BEK内核,支持ARM架构,修复了Intel CPU的L1TF漏洞,基于红黑树管理tcp重传队列,qdisc支持CAKE队列管理算法,xfs文件系统支持lazytime特性,并增加自研补丁支持容器Namespace内tcp_fastopen调优参数。
2.1 默认修复Intel CPU漏洞
在2018年初,Intel CPU爆出两个重大安全漏洞Spectre 、Meltdown,漏洞广泛影响1995年之后的处理器。Intel CPU存在设计上的缺陷,导致***者可以读取系统内核的内存,不受系统权限的限制。最新的BEK内核已经默认修复了这两个严重的安全漏洞,可以使用漏洞检测脚本进行验证,具体方法如下:
下载并执行IntelCPU漏洞检测脚本:
# ./spectre-meltdown-checker.sh
使用该脚本检测漏洞修复情况,可以看到Spectre(幽灵)及Meltdown(熔断)漏洞已经得到修复:
图1 Intel CPU漏洞修复
2.2 BBR拥塞控制
在/etc/sysctl.conf里面添加如下设定,TCP默认使用BBR拥塞控制算法:
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
保存生效:
# sysctl -p
查看确认tcp_bbr模块可以正确加载:
# lsmod | grep bbr
tcp_bbr 20480 0
通过tc命令控制网卡丢包率达到1%:
# modprobe sch_netem
# tc qdisc add dev eth0 root netem loss 1%
在客户端通过wget测试下载速度,下载速率为659MB/s:
# wget http://192.168.10.184/BCLinux-R7-U4-Server-x86_64-DVD-180727.iso
…
2018-08-22 16:26:16 (659 MB/s) - ‘BCLinux-R7-U4-Server-x86_64-DVD-180727.iso’ saved [4856467456/4856467456]
关闭BBR,打开默认的CUBIC机制作为拥塞控制算法:
net.ipv4.tcp_congestion_control = cubic
net.core.default_qdisc = pfifo_fast
同样测试wget下载速度,可以看到下载速率下降为175MB/s,而在BBR模式下速率为659MB/s,所以BBR拥塞控制算法的加速效果非常明显,在有一定丢包率的网络链路上充分利用带宽,非常适合高延迟、高带宽的网络链路:
# wget http://192.168.10.184/BCLinux-R7-U4-Server-x86_64-DVD-180727.iso
...
2018-08-22 16:24:27 (175 MB/s) - ‘BCLinux-R7-U4-Server-x86_64-DVD-180727.iso’ saved [4856467456/4856467456]
2.3 TCP Fastopen特性
TFO(TCP Fast Open)是一种能够在TCP连接建立阶段传输数据的机制,使用这种机制可以将数据交互提前,降低应用层事务的延迟,提高两端点之间连接的打开速度。BEK内核开启该特性的基本步骤参考如下:
在/etc/sysctl.conf里面添加如下设定:
net.ipv4.tcp_fastopen = 3
保存生效:
# sysctl -p
安装nginx服务:
# yum install nginx
配置nginx默认开启TCP fastopen属性:
# cat /etc/nginx/nginx.conf | grep fastopen
listen 80 fastopen=3 reuseport default_server;
listen [::]:80 fastopen=3 reuseport default_server;
安装最新版本的curl工具,可以测试TCP fastopen效果:
# pushd curl
# ./buildconf
# ./configure
# make && make install
# popd
在环回接口lo抓包:
# tcpdump -i lo -s0 -w lo.pcap
通过curl测试验证在tcp fasopen开启的情况下,访问nginx主页正常,执行如下命令两次:
# curl --tcp-fastopen localhost
# curl --tcp-fastopen localhost
tcp fasopen的key会自动随机生成:
# cat /proc/sys/net/ipv4/tcp_fastopen_key
7bc50abb-123fb8cf-9232816a-41e91ee6
抓包结果显示有tcp fastopen cookie,而且第二次tcp连接在syn包里会带上get请求的数据,节省了请求包的一次来回,在数据传输的开始降低了延迟:
图2 TCP Fastopen
2.4 Cgroup默认支持eBPF程序
eBPF程序可以动态的将用户态程序插入到内核之中,能够做到不修改程序就可以直接监控一个正在运行的进程。BEK内核支持在Cgroup中体验eBPF程序,下面请看一个应用示例:
- 安装go语言环境,源码安装或者利用yum源安装go的RPM包:
# yum groupinstall "Development Tools"
# yum install go
安装ebpf监控工具BCC[1],具体可以参考INSTALL.md:
# git clone https://github.com/iovisor/bcc.git
# mkdir bcc/build; cd bcc/build
# cmake .. -DCMAKE_INSTALL_PREFIX=/usr
# make
# sudo make install
获取go的bpf库框架源码,并将源码恢复到支持cgroup监控的初始版本:
# go get github.com/iovisor/gobpf
# cd ~/go/src/github.com/iovisor/gobpf/
# git checkout 0da86fd81e69febe51a46ad77a464017a1b690f2
下载cgroup的ebpf测试程序[2]:
# git clone https://github.com/kinvolk/cgroup-ebpf.git
修改该测试代码,将AttachProgram替换为最新的AttachCgroupProgra:
$ git diff
diff --git a/main.go b/main.go
index fb4be53..1463da2 100644
--- a/main.go
+++ b/main.go
@@ -42,7 +42,7 @@ func main() {
}
for cgProg := range b.IterCgroupProgram() {
- if err := b.AttachProgram(cgProg, os.Args[2], elf.EgressType); err != nil {
+ if err := b.AttachCgroupProgram(cgProg, os.Args[2], elf.EgressType); err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
os.Exit(1)
}
编译ebpf测试程序:
# make
参考测试样例,新建cgroup-v2组,并将sshd进程加入该组:
# mkdir /cgroup2
# mount -t cgroup2 none /cgroup2
# mkdir -p /cgroup2/unified/demo
# echo 1832 > /cgroup2/unified/demo/cgroup.procs
最后执行测试程序`cgroup-ebpf`,可以监控sshd进程收发包情况:
# ./cgroup-ebpf out/ebpf.o /cgroup2/unified/demo/
2.5 Cgroup v2线程模式
BEK内核从4.14版本[3]开始默认支持Cgroup v2的线程模式,可以创建线程子目录,用于限制线程资源,每个线程可以绑定线程子目录的cgroup组,具体配置方法可参考如下:
新建cgroup v2测试组:
# mkdir /cgroup2
# mount -t cgroup2 -o none /cgroup2/
# mkdir -p /cgroup2/unified/demo
默认情况下,所有进程会统计在根目录的`cgroup.procs`里,而所有线程统计在`cgroup.threads`里:
# cat /cgroup2/cgroup.procs | wc -l
156
# cat /cgroup2/cgroup.threads | wc -l
249
举例说明一下,如果安装了`docker`服务,可以将dockerd-current的某个线程加入之前新建demo的组里做资源限制:
# yum install docker
# systemctl start docker
...
# echo 1523 > /cgroup2/unified/demo/cgroup.procs
# echo 10936 > /cgroup2/unified/demo/cgroup.threads
2.6 其他Cgroup v2新增特性
BEK内核从4.19版本[4]开始可以在cgroup v1中兼容使用v2的功能特性,例如对于cpuset组,使用方法参考如下:
首先卸载系统默认的cgroup v1的cpuset组:
# umount /sys/fs/cgroup/cpuset/
重新挂载cpuset组,增加mount选项`cpuset_v2_mode`:
# mount -t cgroup -ocpuset,nosuid,nodev,noexec,cpuset_v2_mode cgroup /sys/fs/cgroup/cpuset/
支持设定更多cgroup资源控制属性,包括:
1. 通过配置cgroup.max.descendants设定最多子cgroup数量; 2. 通过配置cgroup.max.depth设定cgroup树的最大深度; 3. cgroup.stat统计信息;
# cat /cgroup2/cgroup.stat
nr_descendants 2
nr_dying_descendants 0
# cat /cgroup2/cgroup.max.depth
max
# cat /cgroup2/cgroup.max.descendants
max
3 性能测试
kernel-bek默认集成使用了大量社区内核版本的功能,在研发过程中,为了验证社区版内核的性能以及稳定性,我们引入了成熟的PTS开源自动化测试框架,包括众多CPU、网络、磁盘、中间件应用性能测试套件,在Linux社区每次发布主线或者长期支持版本内核时,都会基于社区版本自动化构建RPM包并进行性能测试,而且测试完成后会自动发送邮件通知,测试结果在Review之后可以评估决定是否发布版本:
图3 性能对比测试
在测试过程中,我们也发现了不少内核的缺陷,并为社区贡献了多个补丁,主要包括漏洞修复、代码改进、新特性支持等功能优化,如修复潜在的内存泄露BUG,修复KVM虚机崩溃问题,ipip6隧道支持dst_cache特性以提升性能,容器命名空间内支持tcp调优参数等,进一步提升了Linux内核的可用性及稳定性。
4 后续计划
持续开发新特性,做好性能优化,并将补丁回馈开源社区,也积极将社区最新的成果呈现给用户。
进一步完善操作系统及内核产品文档,给云上用户以最佳的体验。
积极参与内核开发大会,分享更多操作系统及内核知识,增强社区内核领域的合作与交流。
5 结语
BEK内核由BC-Linux操作系统团队负责开发,欢迎有志之士加入我们的团队,共同参与云上操作系统的开发,为BEK内核“添砖加瓦”,探索实现更多的可能。简历可发至zhangshengju@cmss.chinamobile.com。扫码↓加微信了解更多。参考文献:
[1] https://github.com/iovisor/bcc/blob/master/INSTALL.md
[2] https://github.com/kinvolk/cgroup-ebpf
[3] https://kernelnewbies.org/Linux_4.14
[4] https://kernelnewbies.org/Linux_4.19