LinkedIn 即时通信系统的优化

前言

LinkedIn 的即时通信系统目前单台机器可以处理数十万的持久连接,这是不断调优的结果。

最近,他们在官网博客中发布了优化过程,介绍了即时通信系统的技术选型、调优的重点。
基础技术构成

即时通信技术的基本要求就是server能够向client推送数据,需要通过持久连接实现,而不是传统的“请求-响应”模式。

对于这个需求,LinkedIn 选择了 Server-sent events (SSE)来实现。

SSE 特点是简单、兼容性好,client只需要和server建立一个普通的HTTP连接,当server中有事件发送时,就会向client推送数据流。

配合 SSE 的 EventSource 接口被所有现代浏览器支持,iOS 与 Android 中也有现成的库,所以 SSE 的兼容性不成问题,这也是 LinkedIn 没有选择 Websockets 原因。

开发语言使用 JAVA,编程模型选用 Actor模型,Akka是一个优秀的Actor库。

开发框架使用了 Play,他可以很好的集成 EventSource 与 Akka。
优化过程

socket最大连接数限制

LinkedIn 刚开始做性能测试时,发现并发连接始终无法超过128个,这肯定是不正常的,应用服务器处理上千并发连接是很轻松的,后来发现是一个系统内核参数的限制:

net.core.somaxconn

这个参数控制的是允许积压的TCP连接数量, 当一个连接请求过来时,如果数量达到上限了,就会被拒绝掉,128是很多系统的默认值。

可以在 /etc/sysctl.conf中进行调整。

临时端口的限制

负载均衡器每次连接到一个server节点时,都会使用一个 临时端口,当连接终止时,这个端口会再次可用。

而持久连接不会像普通HTTP连接那样终止,所以,负载均衡器的临时端口就可能被耗尽。

这一点需要在选择负载均衡器时特别注意。

文件描述符的限制

在加大测试压力后,出现了一个异常:

java.net.SocketException: Too many files open

这说明文件描述符不够用了,在 Linux 中,一切皆文件,例如访问标准的文件、连接网络socket 等等,都需要文件描述符。

对于运行中进程的文件描述符限制,可以这样查看:

$ cat /proc/<pid>/limits

...
Max open files            30000

假设想调整到 200000,修改 /etc/security/limits.conf:

<process username>  soft nofile 200000

<process username>  hard nofile 200000

系统级的文件描述符限制的调整是在 /etc/sysctl.conf 中:

fs.file-max

小结

这里整理的是几个通用的优化点,原文中有更详细的描述,还有两点对JVM的调优,有兴趣的朋友可以看下原文,地址:

https://www.1.qixoo.com/blog/2016/10/instant-messaging-at-linkedin--scaling-to-hundreds-of-thousands-

时间: 2024-10-21 10:06:56

LinkedIn 即时通信系统的优化的相关文章

Linkedin工程师是如何优化他们的Java代码的

原文链接:Linkedin工程师是如何优化他们的Java代码的 最近在刷各大公司的技术博客的时候,我在Linkedin的技术博客上面发现了一篇很不错博文.这篇博文介绍了Linkedin信息流中间层Feed Mixer,它为Linkedin的Web主页,大学主页,公司主页以及客户端等多个分发渠道提供支撑(如下图所示). 在Feed Mixer里面用到了一个叫做SPR(念"super")的库.博文讲的就是如何优化SPR的java代码.下面就是他们总结的优化经验. 1. 谨慎对待Java的循

即时通信系统中如何实现:支持PC端和移动端同时在线(即支持同帐号多设备同时登录)?

如果我们开发的即时通信系统(IM系统)要支持同帐号多设备同时登录的场景(或称"多地登录"),即需要像QQ一样,在PC端登录的同时,也可以使用同一个帐号登录移动端(iOS或Android),那么,如何才能做到了? 在ESFramework/ESPlatform体系中,是使用 UserID 作为唯一标志来标记每一个用户的,也就是说,对于一个指定的UserID,只能有一个客户端在线.所以,ESFramework 虽然支持多种类型的客户端设备,但是,ESFramework并不支持不同类型的客户

花了2个月完成的企业即时通信系统 -- 傲瑞通(OrayTalk)

傲瑞通(OrayTalk)是我空闲时写的一个企业即时通讯平台,通信功能还是很强大的,像组织结构.文字/语音/视频会话.文件传送.远程协助.消息记录等功能都有,并且留有接口可与企业遗留系统进行集成.废话不多说,来详细看看OrayTalk的功能吧! 1.主要功能 傲瑞通主要功能特性如下所示: (01)企业组织结构. (02)文字聊天:字体设置.表情.振动提醒.截图.手写板. (03)语音.视频聊天. (04)文件/文件夹传送(支持断点续传). (05)离线文件.离线消息. (06)远程协助. (07

基于XMPP的即时通信系统的建立

XMPP详解 XMPP(eXtensible Messaging and Presence Protocol,可扩展消息处理和现场协议)是一种在两个地点间传递小型结构化数据的协议.在此基础上,XMPP协议已经被用来构建大规模即时通信系统.游戏平台.协作空间及语音和视频会议系统. XMPP由几个小的构造块组成,并在此基础上扩展出了更多的构造块.XMPP中有众多系统:发布-订阅服务.多人聊天.表单检索与处理.服务发现.实时数据传输.隐私处理及远程过程调用等. 大多数社交媒体(Facebook及Twi

第十七章——配置SQLServer(3)——配置“对即时负载的优化”

原文:第十七章--配置SQLServer(3)--配置"对即时负载的优化" 前言: 在第一次执行查询或者存储过程时,会创建执行计划并存储在SQLServer的过程缓存内存中.在很多时候,我们会执行一些简单的程序,仅仅执行一次,而为这些查询创建存储过程是非常浪费内存资源的.由于内存不足,可能会导致你的缓存溢出,从而影响性能.在2005之前,这是一个大问题,为了纠正这个问题.微软在SQLServer 2008中引入了对即时查询负载的优化功能.这个功能在2012也依旧可用.是基于实例级别的.

天天玩微信,Spring Boot 开发私有即时通信系统了解一下

1/ 概述 利用Spring Boot作为基础框架,Spring Security作为安全框架,WebSocket作为通信框架,实现点对点聊天和群聊天. 2/ 所需依赖 Spring Boot 版本 1.5.3,使用MongoDB存储数据(非必须),Maven依赖如下: <properties> <java.version>1.8</java.version> <thymeleaf.version>3.0.0.RELEASE</thymeleaf.ve

Linkedin工程师是如何优化他们的Java代码的(转)

英文原文:LinkedIn Feed: Faster with Less JVM Garbage 最近在刷各大公司的技术博客的时候,我在Linkedin的技术博客上面发现了一篇很不错博文.这篇博文介绍了Linkedin信息流中间层Feed Mixer,它为Linkedin的Web主页,大学主页,公司主页以及客户端等多个分发渠道提供支撑(如下图所示). 在Feed Mixer里面用到了一个叫做SPR(念“super”)的库.博文讲的就是如何优化SPR的java代码.下面就是他们总结的优化经验. 1

配置对即时负载的优化

前言: 在第一次执行查询或者存储过程时,会创建执行计划并存储在SQLServer的过程缓存内存中.在很多时候,我们会执行一些简单的程序,仅仅执行一次,而为这些查询创建存储过程是非常浪费内存资源的.由于内存不足,可能会导致你的缓存溢出,从而影响性能.在2005之前,这是一个大问题,为了纠正这个问题.微软在SQLServer 2008中引入了对即时查询负载的优化功能.这个功能在2012也依旧可用.是基于实例级别的. 很多开发人员直接在生产环境运行和测试查询,如果没有得到期望的结果,会更改查询然后再次

JVM中的 JIT 即时编译及优化技术

JVM Client 模式和 Server模式的区别 查看JVM模式 通过 java -version 可查看 JVM 所处的模式,并可以通过修改配置文件进行配置,那它们有什么区别呢? Server:-Server 模式启动时,速度较慢,但是启动之后,性能更高,适合运行服务器后台程序 Client:-Client 模式启动时,速度较快,启动之后不如 Server,适合用于桌面等有界面的程序 热点代码 理解 当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”. 热点代码