Whatsapp已经使用Erlang在生产环境跑到96GB内存单机 3M长连接,参加:WhatsApp的Erlang世界。毕竟业务级别能达到Whatsapp那样极少,现在只有千万级,单机太多挂一台影响太大,再者就是没有多线接入,每个机房都得扔那么几台机器吧,所以1M就能满足要求。

Erlang 作为长连接网关有着天生的优势:

- 擅长与IO密集型业务,也要求将网关设计尽量简单,认证完后,简单解析报头,就直接将请求转发给后端服务处理

- 网络层有beam c 实现得非常高效 ,erlang 代码只是简单流程控制,也就是说代码性能很接近优化的很好c程序

- 代码简单,易维护,erlang 进程和连接一对一关系,代码500行左右

- 基于进程GC,node 内存多大也不用担心stop of word

- 热升级,网关设计本尽量简单,减少升级,但也不可避免,热升级保证不断连接

- 稳定,beam 足够稳定,即使天天更新的服务,连续一两年不重启也正常

- 多语言混合,后端可很容易使用其他语言实现

劣势:CPU密集型业务,性能差,如果不想用c解包,尽量使用二进制协议,尽量将包协议标识放在包体固定位置,方便dispatch

1. 测试环境

  - 服务端: R620 2*(E5-2620 6核心12线程)/mem:128GB

  - 客户端:R620 2*(E5-2620 6核心12线程)/mem:48GB(5台*5 IP,共25IP)

2. 调优

  1. beam 启动参数

  +sbt db 绑定调度器与CPU的亲缘性

  +P 2000000 进程数限制(合适即可)

  +K true 启用epoll

  +sbwt none 关闭beam 调度器 spinlock,降低CPU

  +swt low 提高调度器唤醒灵敏度,避免长时间运行睡死问题

  参考我另外一篇:erlang cpu 相关参数调整

  2. Erlang 网络库:ranch 需要修改

    - 配置acceptors 数量1024,backlog 32768

    同时系统backlog调整: net.core.somaxconn, net.core.netdev_max_backlog, net.ipv4.tcp_max_syn_backlog 32768

    - 删除新加连接时的 ranch_sup 和 connection monitor,占用内存且用处不大,同时单进程热点问题,也造成backlog 无法及时处理

    - acceptor 设置 process_flag(prority, high),否则因为公平调度问题,即使CPU不高,backlog 无法及时得到处理

3. Erlang内存占用

   因为Erlang GC 基于进程,每个连接对应一个进程,每个连接的业务量都很小。那样就会造成一种现象数百w进程内都有一点垃圾,无法得到GC。

   使用hibernate,erlang:hibernate 会清空但前调用栈,并强制GC,下次进程收到消息后,会通过参数MFA继续执行。

   使用gen_server 简单的在没有个包处理完后,都加上hibernate, CPU无明显增加情况下,可将内存使用降低到1/3 以下,非常值得使用。

3. 压测场景

  - 客户端在5台机器,25个IP,开启 tcp_tw_reuse tcp_tw_recycle 后每个IP稳定跑6w连接还是没问题的。

  - 6K/s 登陆、认证、心跳、退出 操作

  - 1w/s 消息推送、ack

  - 运行12 小时

4. 结果

 ss -s
Total: 1500254 (kernel 1500317)
TCP: 1500090 (estab 1500077, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 74 Transport Total IP IPv6
* 1500317 - -
RAW 0 0 0
UDP 0 0 0
TCP 1500090 1500090 0
INET 1500090 1500090 0
FRAG 0 0 0

  网关机器:

  - CPU 500%

  - 网卡 6w/s tcp packet in/out

  - node mem 12GB (内部memory(total) 显示实际使用9GB)

  - kernel mem 11GB

  - 也就是150w连接,使用了23GB内存,每个连接占用15KB,约一半是内核使用,erlang 使用内存并不多。

  - 在如此业务量压力下,500% CPU表现也不俗,随无法和c相比,但其多核扩展性好。

  - 服务器有24核心,但环境其他服务、客户端IP数限制,没有继续增大压力,理论上单机200~300w 连接,5w/s 消息推送 应该不是问题。

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

  1. Erlang C1500K长连接推送服务-内存

    上篇 Erlang C1500K长连接推送服务-性能 提到:150w连接,使用了23GB内存,每个连接占用15KB,约一半是内核使用. 大概分析一下: 1. Erlang 节点 12GB,内部因为有内 ...

  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. 基于netty-socketio的web推送服务

    实时消息的推送,PC端的推送技术可以使用socket建立一个长连接来实现.传统的web服务都是客户端发出请求,服务端给出响应.但是现在直观的要求是允许特定时间内在没有客户端发起请求的情况下服务端主动推 ...

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

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

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

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

随机推荐

  1. JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐(二)

    前言:上篇 JS组件系列——Bootstrap组件福利篇:几款好用的组件推荐 分享了几个项目中比较常用的组件,引起了许多园友的关注.这篇还是继续,因为博主觉得还有几个非常简单.实用的组件,实在不愿自己 ...

  2. FCM聚类算法介绍

    FCM算法是一种基于划分的聚类算法,它的思想就是使得被划分到同一簇的对象之间相似度最大,而不同簇之间的相似度最小.模糊C均值算法是普通C均值算法的改进,普通C均值算法对于数据的划分是硬性的,而FCM则 ...

  3. Eclipse安装scala

    Scala官方提供了三种插件,分别支持Eclipse.NetBeans和Intellij IDEA开发环境.要在Eclipse IDE下安装Scala插件:选择Eclipse的菜单项Help--> ...

  4. MapControl图层删除或添加触发监听事件

    监听MapControl中对于图层添加和删除的事件 IActiveViewEvents_Event m_MapActiveViewEvents = m_mapControl.Map as IActiv ...

  5. linux的用户与用户组

    1.上面这个花花绿绿的图片,来自linxu 下etc/passwd文件. 我们来详细的看下这些都值得是什么东西,这些内容都是用冒号来分割的. 2.etc/shadow 3.对比一下这两个文件的权限,为 ...

  6. Struts2深入学习:OGNL表达式原理

    今天看了ognl表达式,不是很理解,准备以后再回头复习: http://developer.51cto.com/art/201203/322509.htm#case1

  7. 初识JVM--java虚拟机的基本知识

    JVM运行时的内存块 pc寄存器:(线程独有)保存线程运行的java方法地址 Java 虚拟接栈(线程独有):用于存储线程的栈帧 Java堆(全局共享):随着Java虚拟机的启动 创建 存储着所有对象 ...

  8. 翻书插件:bookblock.js

    BookBlock 是一个 jQuery插件,用来制作带有翻页效果的小书册.可以用任何形式的内容,比如图像或文本.插件会在翻页时利用变形模拟手工翻页,并产生重叠的阴影以达到更逼真的效果. 基本页面 & ...

  9. python学习笔记-(十四)I/O多路复用 阻塞、非阻塞、同步、异步

    1. 概念说明 1.1 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可 ...

  10. 逆向工程学习第一天--一个VC6编译的小程序

    今天开始研究二进制了,开个文记录一下.下面是一个小程序的OD反汇编代码,自己尝试加了注释,本人逆向零基础,属于摸着石头过河的类型,有理解错误的地方,希望大牛不吝赐教. 源代码: #include< ...