推送

推送

Posted by nomadli on November 11, 2017

概要

  1. 海量长链接 epoll 内存

epoll

  1. 底层实现是一个特殊的文件系统,保存了一棵红黑树和就绪的被侦听文件列表rdllist,红黑树的节点是被侦听文件对象。
  2. epoll_ctl把一个文件加入到epoll的时候,会创建两个数据结构epitem、eppool_entry,epitem关联到被侦听的文件fd,eppool_entry保存了事件就绪时设置rdllist的回调函数ep_poll_callback。
  3. 网卡接收完数据会产生一个硬中断,数据通过DMA拷贝到内存。系统通过软中断守护进程,调用网卡的驱动来完成数据包的解析并最终调用poll方法。poll方法会回调设置好的ep_poll_callback,即把fd挂到rdllist中,当调用的epoll_wait时候,即可获取到就绪的fd集合。
  4. 系统优化

    配置 配置
    系统文件打开数 /proc/sys/fs/file-max 2500000
    进程文件打开数 /proc/sys/fs/nr_open 2500000
    Epoll监听fd数 ../epoll/max_user_watches 2500000
    内核TCP内存 ../net/ipv4/tcp_mem 75475210063361509504
    listen排队最大 ../net/core/somaxconn 1024
    tcp快速回收 ../net/ipv4/tcp_tw_recycle 1
    tcp端口重用 ../net/ipv4/tcp_tw_reuse 1
    westwood拥塞算法 ../net/ipv4/tcp_westwood 0
    scatter-gather 推送包很小 0
    generic-segmentation-offload 包很小 0
  5. 减少内存拷贝
  6. 无锁共享内存、协程
  7. 减少用户态内核态切换
  8. SSE4.2 指令集自带CRC32校验