首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

【项目设计】高并发内存池

1. 本项目基于google公司的开源项目tcmalloc作为背景,简化实现一个高并发内存池,用该项目可以替代传统的malloc free函数来申请和释放内存,malloc和free作为我们最开始接触内存管理的元老级函数是在熟悉不过的了,有人说已经有malloc和free这样的内存管理函数了,我们搞一个tcmalloc真的有意义吗?其实不然,像malloc和free这种的函数是通用级别的,而通用的东西往往都带有一个特性,那就是适用性强,可移植性强,但是随之而带来的缺点就是针对性不够明显,比如对于某些高并发项目场景,项目内的线程数量众多,不断的调用malloc,可能会涉及到频繁的加锁和解锁,这对于项目性能的影响是不可小觑的,所以在某些高并发场景,同时对性能要求又高的情况下,malloc和free就显的没那么能打了,此时google公司召集了一批顶尖的cpp高手写出来了tcmalloc这样高效的内存管理项目,而我们的这个项目只是从tcmalloc里面摘取了精华部分,目的就是学习和理解高效的内存管理应该是什么样子的,而不是造一个更好的轮子出来。

00

Linux上的TIME_WAIT和tcp_fin_timeout

当Linux服务器的TIME_WAIT过多时, 通常会想到去修改参数降低TIME_WAIT时长, 以减少TIME_WAIT数量,但Linux并没有提供这样的接口, 除非重新编译内核。 Linux默认的TIME_WAIT时长一般是60秒, 定义在内核的include/net/tcp.h文件中: #define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT state,  * about 60 seconds  */ #define TCP_FIN_TIMEOUT TCP_TIMEWAIT_LEN /* BSD style FIN_WAIT2 deadlock breaker.  * It used to be 3min, new value is 60sec,  * to combine FIN-WAIT-2 timeout with  * TIME-WAIT timer.  */ 注意tcp_fin_timeout不是TIME_WAIT时间: # cat /proc/sys/net/ipv4/tcp_fin_timeout 60 tcp_fin_timeout实为FIN_WAIT_2状态的时长, Linux没有提供修改TIME_WAIT时长接口,除非修改宏的定义重新编译内核。 但Windows可以修改注册表中的TcpTimedWaitDelay值来控制TIME_WAIT时长。 RTO:超时重传(Retransmission Timeout) TIME_WAIT是一个常见经常的问题,相关内容(/etc/sysctl.conf或/proc/sys/net/ipv4): 1) net.ipv4.tcp_timestamps    为1表示开启TCP时间戳,用来计算往返时间RTT(Round-Trip Time)和防止序列号回绕 2) net.ipv4.tcp_tw_reuse    为1表示允许将TIME-WAIT的句柄重新用于新的TCP连接 3) net.ipv4.tcp_tw_recycle    为1表示开启TCP连接中TIME-WAIT的快速回收,NAT环境可能导致DROP掉SYN包(回复RST) 4) net.ipv4.tcp_fin_timeout    FIN_WAIT_2状态的超时时长 5) net.ipv4.tcp_syncookies    为1时SYN Cookies,当SYN等待队列溢出时启用cookies来处理,可防范少量SYN攻击 6) net.ipv4.tcp_max_tw_buckets    保持TIME_WAIT套接字的最大个数,超过这个数字TIME_WAIT套接字将立刻被清除并打印警告信息 7) net.ipv4.ip_local_port_range 8) net.ipv4.tcp_max_syn_backlog    端口最大backlog内核限制,防止占用过大内核内存 9) net.ipv4.tcp_syn_retries    对一个新建连接,内核要发送多少个SYN连接请求才决定放弃,不应该大于255 10) net.ipv4.tcp_retries1    放弃回应一个TCP连接请求前﹐需要进行多少次重试,RFC规定最低的数值是3,这也是默认值 11) net.ipv4.tcp_retries2    在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试,默认值为15 12) net.ipv4.tcp_synack_retries    TCP三次握手的SYN/ACK阶段重试次数,缺省5 13) net.ipv4.tcp_max_orphans    不属于任何进程(已经从进程上下文中删除)的sockets最大个数,超过这个值会被立即RESET,并同时显示警告信息 14) net.ipv4.tcp_orphan_retries    孤儿sockets废弃前重试的次数,缺省值是7 15) net.ipv4.tcp_mem    内核分配给TCP连接的内存,单位是page:    第一个数字表示TCP使用的page少于此值时,内核不进行任何处理(干预),    第二个数字表示TCP使用的page超过此值时,内核进入“memory pressure”压力模式,    第三个数字表示TCP使用的page超过些值时,报“Out of socket memory”错误,TCP 连接将被拒绝 16) net.ipv4.tcp_rmem    为每个TCP连接分配的读缓冲区内存大小,单位是byte 17) net.ipv4.tcp_wmem    为每个TCP

04
领券