上篇 Erlang C1500K长连接推送服务-性能 提到:150w连接,使用了23GB内存,每个连接占用15KB,约一半是内核使用。

大概分析一下:

1. Erlang 节点

  12GB,内部因为有内存池碎片问题,实际使用9GB,也就是实际每个进程+Port占用越6K,因为采用hibernate策略,已经没水分了。

2. linux内核

  11GB,通过运行前后, cat /proc/meminfo 中 MemTotal - AnonPages 值的增加量基本就是内核占用。

  实际Slab: 5388732 kB,只有5GB,另外6GB上哪儿去了?。。。

  slabtop:  

 Active / Total Objects (% used)    : 9821361 / 9912211 (99.1%)
Active / Total Slabs (% used) : 967448 / 967448 (100.0%)
Active / Total Caches (% used) : 91 / 174 (52.3%)
Active / Total Size (% used) : 4664151.73K / 4676348.50K (99.7%)
Minimum / Average / Maximum Object : 0.02K / 0.47K / 4096.00K OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
1500136 1500097 99% 1.69K 375034 4 3000272K TCP
1500330 1500268 99% 0.69K 300066 5 1200264K sock_inode_cache
1808780 1808377 99% 0.19K 90439 20 361756K dentry
1501840 1501054 99% 0.19K 75092 20 300368K filp
1529370 1501237 98% 0.12K 50979 30 203916K eventpoll_epi
1529474 1501153 98% 0.07K 28858 53 115432K eventpoll_pwq
116030 113558 97% 0.78K 23206 5 92824K ext3_inode_cache
30560 30538 99% 1.00K 7640 4 30560K ext4_inode_cache

 TCP 内存使用

  参考:

  1.  高性能网络编程7--tcp连接的内存使用

  2. 内核协议栈tcp层的内存管理

   配置示例:

net.ipv4.tcp_mem=1523712 2031616 3047424  tcp 总内存限制,单位页(low pressure high)

net.ipv4.tcp_rmem = 8192 87380 8738000 单个连接的接收buff (min, default, max)

net.ipv4.tcp_wmem = 4096 65536 6553600 单个连接的发送buffer(min, default, max)

net.ipv4.tcp_adv_win_scale = 2 也就是1/4 的buffer 会被用于存放应用数据

  设置buffer大小

   - 默认对于单个连接buffer 都是动态分配的,max 限制最大buffer

   - 网关不要使用SO_SNDBUF, SO_RECVBUF 限制设置,会导致buffer 预留,而不是动态分配,造成内存浪费

   - 关闭应用层封装buffer,不少IO库应用层都有buffer,应关闭减少不必要copy和内存浪费

  控制内存

   测试环境没网络畅通,而实际生产环境复杂多样,尤其移动终端。网络拥挤、攻击容易会使得服务实际内存消耗会更大。

   设备需要配备更高内存,并且做好流控:

  1. 接收

    一般来说只要包不是太小,现在应用使用CPU单核心都能跑满KM网卡,对于网关应用而言,CPU不应该是瓶颈。

    也就是客户端发多快,应用就能收多快。

    gen_tcp {active, true}

  2. 发送

    因为环境多变,下行链路,移动设备网络状况,拥塞是不可避免的,所以需要控制发送buff内存。

    - 内核

      上面提到3个参数,根据系统内存,合理配置,至少保证内核buffer满时应用还有内存可用

    - 应用

      设置 gen_tcp {recbuf, 0}, {sndbuf, 0}, {send_timeout, 5000} 设置buffer=0 保证不会在应用层buffer堆积过多的包,

    send_timeout 后,说明此连接从此拥塞,失败后如果发现后续很多包,且应用内存过高,可选择丢弃部分。

      就像再windows 平台IOCP下,send 永远是无阻塞成功,对方拥塞也能一直发下去直到OOM,需要通过回调维护未写入tcp buffer的packet 长度,超过一定时采用丢弃策略。

Erlang C1500K长连接推送服务-内存的更多相关文章

  1. Erlang C1500K长连接推送服务-性能

    Whatsapp已经使用Erlang在生产环境跑到96GB内存单机 3M长连接,参加:WhatsApp的Erlang世界.毕竟业务级别能达到Whatsapp那样极少,现在只有千万级,单机太多挂一台影响 ...

  2. Asp.Net实现Http长连接推送

    话说最新帮一个朋友搞智能家居方面的东西,做一个云平台.主要作用手机在局域网外环境时对手机客户端和智能网关中命令的互相转发. 目前已经有了一个稳定的Socket版本,但是考虑到以后的扩展和性能指标要改成 ...

  3. Web长连接推送

    http://www.workerman.net/web-sender http://wahahachuang5.iteye.com/blog/2311313

  4. 转 互联网推送服务原理:长连接+心跳机制(MQTT协议)

    http://blog.csdn.net/zhangzeyuaaa/article/details/39028369 目录(?)[-] 无线移动网络的特点 android系统的推送和IOS的推送有什么 ...

  5. 互联网推送服务原理:长连接+心跳机制(MQTT协议)

    互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了 ...

  6. push推送服务设计

    PUSH系统架构设计简述 一.网络传输协议的选择 PUSH系统协议选取: UDP协议实时性更好,但是如何处理安全可靠的传输并且处理不同客户端之间的消息交互是个难题,实现起来过于复杂,那就非TCP协议莫 ...

  7. Mosquitto搭建Android推送服务(一)MQTT简介

    总体概要: MQTT系列文章分为4部分 1.MQTT简介 2.mosquitto服务器搭建 3.编写Mosquitto的可视化工具 4.使用Mosquitto完成Android推送服务 文章钢要: 对 ...

  8. Netty系列之Netty百万级推送服务设计要点

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  9. Ejabberd作为推送服务的优化手段

    AVOS Cloud目前还在用Ejabberd做Android的消息推送服务.当时选择Ejabberd,是因为Ejabberd是一个发展很长时间的XMPP实现,并且基于Erlang,设想能在我们自主研 ...

随机推荐

  1. Doc

    一:window: 属性(值或者子对象):opener:打开当前窗口的源窗口,如果当前窗口是首次启动浏览器打开的,则opener是null,可以利用这个属性来关闭源窗口. 方法(函数):事件(事先设置 ...

  2. UDP通信

    package com.slp; import java.io.IOException; import java.net.DatagramPacket; import java.net.Datagra ...

  3. jquery网页可见区域宽

    网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...

  4. 学习vue.js 第一天

    最近听到很多人都在用Vue.js ,我也想凑凑热闹,来个入门 啥的 ,要不以后人家说,啥都不知道,多low 看到官网 是这样介绍Vue.js Vue.js(读音 /vjuː/, 类似于 view) 是 ...

  5. 关于C++默认初始化的总结——开个坑

    关于C++初始化总结的博客,其实以前在我的独立博客上写过相关的内容,可惜呀,没有续费,腾讯回收了我的空间, 到现在,关于C++初始化的内容,一直是我的心头病,现在准备开个坑,慢慢的总结进来吧. 1.关 ...

  6. Java防止SQL注入(转)

    一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...

  7. CentOS 7 配置虚拟主机站点

    1.进入/etc/httpd/conf 下 将httpd.conf 打开. 2.将DocumentRoot注释掉.(将ServerName 打开要不会有错误警告). 3.将虚拟主机站点配置包含进来:I ...

  8. Chrome 开发工具之Network

    经常会听到比如"为什么我的js代码没执行啊?","我明明发送了请求,为什么反应?","我这个网站怎么加载的这么慢?"这类的问题,那么问题既然 ...

  9. Mac OS使用brew安装Nginx、MySQL、PHP-FPM的LAMP开发环境

    准备工作 新版的 Mac OS 内置了Apache 和 PHP,我的系统版本是OS X 10.9.3,可以通过以下命令查看Apache和PHP的版本号: httpd -v Server version ...

  10. angular2学习--根模块

    最近有时间,学习一下angular2,根据自己的理解添加一些自己的理解,有什么不对的地方请指教, 学习的地址是https://angular.cn/ 下边是分享一下我学习过程 angular2和ang ...