Libevent 本身已经很快了,但要达到极致性能(如单机百万并发),还需要对系统和应用进行全方位调优。
1. 内核参数调优 (Linux)
1.1. 文件描述符限制
ulimit -n 1000000永久生效需修改
/etc/security/limits.conf。
1.2. TCP 协议栈
修改 /etc/sysctl.conf:
# 增加监听队列长度
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# 扩大端口范围 (作为客户端时)
net.ipv4.ip_local_port_range = 1024 65535
# 开启 TCP Fast Open (可选)
net.ipv4.tcp_fastopen = 32. Libevent 调优
2.1. 开启 Changelist
对于 epoll 后端,开启 Changelist 可以合并多次
epoll_ctl 调用,减少系统调用开销。
struct event_config *cfg = event_config_new();
event_config_set_flag(cfg, EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST);
struct event_base *base = event_base_new_with_config(cfg);2.2. 避免小包风暴
如果对端发送大量 1 字节的小包,你的读回调会被频繁触发。
对策: 设置低水位
(bufferevent_setwatermark),比如 128
字节。只有积攒了足够数据才唤醒回调。
3. 应用层调优
3.1. 内存分配器
glibc 的 malloc
在多线程下锁竞争严重。推荐链接 tcmalloc
(Google) 或 jemalloc (Facebook)。通常只需
LD_PRELOAD 即可带来 10%-20% 的性能提升。
3.2. CPU 亲和性 (Affinity)
将 Event Loop 线程绑定到固定的 CPU 核上,减少上下文切换和 Cache Miss。
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(thread_id % num_cores, &cpuset);
pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);4. 总结
性能调优是一个系统工程。不要盲目调整参数,建议使用
perf 和 wrk
进行基准测试,找到瓶颈后再对症下药。
上一篇: 07-hardening/security.md - 安全与鲁棒性 下一篇: 07-hardening/pitfalls.md - 常见陷阱