土法炼钢兴趣小组的算法知识备份

性能调优

目录

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 = 3

2. 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. 总结

性能调优是一个系统工程。不要盲目调整参数,建议使用 perfwrk 进行基准测试,找到瓶颈后再对症下药。


上一篇: 07-hardening/security.md - 安全与鲁棒性 下一篇: 07-hardening/pitfalls.md - 常见陷阱

返回 Libevent 专题索引


By .