本文主要介绍veLinux 1.0操作系统中,内核、系统组件、系统配置和优化等关键特性。
veLinux kernel基于内核社区长期支持(LTS)的5.4版本定制而成,对内存、网络、I/O、文件系统等模块进行了缺陷修复、性能增强并引入了适用于云应用的新特性,例如:
优化冗余的HugeTLB页,降低内存开销。
增加ebpf通用helper函数,支持通过模块添加ebpf功能。
优化了cgroup slab memory controller。
VDUSE设备模拟框架。
PSI特性:针对cgroup级别的CPU stall增加了FULL模式,优化了memory stall FULL模式的实现和进程阻塞切换的开销。
火山引擎自研软件包,如下。
atop是开源社区的一个性能监测工具,火山引擎在社区版本的基础上进行了定制开发,新增feature包括:
支持筛选记录Top N线程的监控数据记录。
支持JSON格式输出监控数据,提供多样化展示。
避免crash后持续写旧文件导致无效写入。
支持定制日志保留天数。
配合veLinux 5.4.56版本内核使用,内核发生kernel panic之时(硬件故障或内核软件issue)第一内核切换到第二内核,处理panic现场,记录关键信息。配合内核dbg包,支持gdb调试和追溯。支持上报服务端,配合监控服务使用,提供内核panic的准实时监控报警功能。
修复了journald重启时日志丢失的问题。
提供了正确读取和显示PCI Gen 4 16GT/s速率的支持。
zlib是开源社区的一个无损压缩的基础库,火山引擎在社区版本madler/zlib上进行了一些性能优化。
支持压缩过程中哈希函数的向量化指令,并且重构了字符串匹配的流程。
增强解压过程中长字符串拷贝效率。
支持crc32/adler32等校验码的向量化指令。
压缩和解压缩性能对比:
基于字节海量业务场景,为了高并发、低时延等业务需求,对内存、文件系统、网络、安全等方面的系统配置进行了深度优化。
高并发
配置项 | 值 | 说明 |
---|---|---|
net.core.netdev_max_backlog | 16384 | 最大积压包的个数 |
net.core.somaxconn | 16384 | 最大积压监听socket的个数 |
net.ipv4.tcp_max_syn_backlog | 16384 | 最大积压SYN同步包请求的个数 |
net.ipv4.ip_local_port_range | 10000 65535 | 本地最小和最大端口的限制 |
net.ipv4.tcp_max_orphans | 2097152 | 孤立连接的最大数量 |
net.ipv4.tcp_max_tw_buckets | 1048576 | 总timewait数 |
低时延
配置项 | 值 | 说明 |
---|---|---|
net.core.rmem_max | 16777216 | 最大socket读buffer |
net.core.wmem_max | 16777216 | 最大socket写buffer |
net.ipv4.tcp_rmem | 4096 87380 33554432 | TCP读buffer的最小/默认/最大值 |
net.ipv4.tcp_wmem | 4096 65536 33554432 | TCP读buffer的最小/默认/最大值 |
net.ipv4.tcp_slow_start_after_idle | 0 | TCP连接在空闲后不进入slow start |
net.ipv4.tcp_fastopen | 3 | client和server都开启fastopen |
net.ipv4.tcp_fin_timeout | 15 | FIN_WAIT_2状态的最大时长 |
网络安全
配置项 | 值 | 说明 |
---|---|---|
net.ipv4.ip_forward | 0 | 禁止网络端口间的IP转发 |
net.ipv6.conf.all.forwarding | 0 | 禁止网络端口间的IPv6转发 |
net.ipv4.tcp_syncookies | 1 | 打开SYN Cookie功能,防止SYN攻击 |
net.ipv4.conf.all.route_localnet | 0 | 阻止跨机器的本地回环访问 |
提高资源利用
配置项 | 值 | 说明 |
---|---|---|
net.ipv4.tcp_tw_recycle | 0 | 关闭TIME-WAIT sockets的快速回收 |
net.ipv4.tcp_tw_reuse | 1 | 允许TIME-WAIT sockets重用 |
net.ipv4.tcp_orphan_retries | 2 | RTO重试次数 |
net.ipv4.tcp_synack_retries | 2 | SYNACK重试次数 |
net.ipv4.tcp_syn_retries | 3 | SYN重试次数 |
net.ipv4.tcp_thin_linear_timeouts | 1 | 开启线性超时重传 |
增加漏洞利用难度
配置项 | 值 | 说明 |
---|---|---|
kernel.dmesg_restrict | 1 | 禁止普通用户读取dmesg |
kernel.randomize_va_space | 2 | 开启地址空间布局随机化 |
vm.unprivileged_userfaultfd | 0 | 禁止普通用户使用userfaultfd系统调用 |
kernel.kptr_restrict | 1 | 只有拥有 CAP_SYSLOG 权限,且 euid==ruid 才可以读取通过 %pK 打印的内核地址 (即通过读取 /proc/kallsyms 获取内核导出符号的地址 ) |
减小攻击面
配置项 | 值 | 说明 |
---|---|---|
kernel.yama.ptrace_scope | 1 | 禁止PTRACE_ATTACH功能 |
kernel.unprivileged_bpf_disabled | 1 | 禁止普通用户使用eBPF系统调用 |
fs.protected_hardlinks | 1 | 限制任意用户创建任意文件的硬链接 |
fs.protected_symlinks | 1 | 对符号链接进行验证 |
fs.suid_dumpable | 0 | SUID_DUMP_DISABLE防止protected/tainted进程的coredump被恶意利用 |
kernel.perf_event_paranoid | 2 | 限制普通用户对 perf event 的访问,缺少 CAP_SYS_ADMIN 特权时,阻止使用 kernel profiling、CPU event、ftrace function tracepoint、 raw tracepoint |
高性能
配置项 | 值 | 说明 |
---|---|---|
vm.swappiness | 0 | 最大限度使用物理内存 |
vm.max_map_count | 2097152 | 最大进程内存空间 |
调试功能
配置项 | 值 | 说明 |
---|---|---|
kernel.sched_schedstats | 1 | 开启scheduler statistics增加调试和统计信息 |
net.core.bpf_jit_enable | 1 | 开启eBPF |
高并发
配置项 | 值 | 说明 |
---|---|---|
kernel.pid_max | 4194303 | 最大PID |
fs.file-max | 12288000 | 最大fd |
net.unix.max_dgram_qlen | 512 | unix socket队列长度 |