专栏首页性能与架构LinkedIn 即时通信系统的优化

LinkedIn 即时通信系统的优化

前言

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

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

基础技术构成

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

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

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

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

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

开发框架使用了 Play,他可以很好的集成 EventSourceAkka

优化过程

  • 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://engineering.linkedin.com/blog/2016/10/instant-messaging-at-linkedin--scaling-to-hundreds-of-thousands-

本文分享自微信公众号 - 性能与架构(yogoup),作者:杜亦舒

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-10-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JS引发页面重排重绘的代价

    示例 目标是修改div内容,3种实现方式,看下每种方式的执行时间 <html> <body> <div id="myDiv1"></div> <div id="...

    dys
  • jquery官方性能优化建议

    jquery的官网上给出了6点性能方面的建议: (1)在循环外面做append操作 DOM操作是有成本的,一次性append要比循环中每次都append要好很多...

    dys
  • Kafka 快速起步

    主要内容: 1. kafka 安装、启动 2. 消息的 生产、消费 3. 配置启动集群 4. 集群下的容错测试 5. 从文件中导入数据,并导出到文件 单机示例 ...

    dys
  • img标签随机获取高质量图片

    zhaoolee
  • (三十九) 初遇python之Context Managers上下文管理器

    各位读者大大们大家好,今天学习python的Context Managers上下文管理器,并记录学习过程欢迎大家一起交流分享。

    亚乐记
  • .net core 实现简单爬虫—抓取博客园的博文列表

    晓晨
  • 基于PhantomJS的动态爬虫引擎

    之前学习爬虫的时候一直了解、学习的是基于PhantomJS的,虽然Chrome的headless更加优秀、比PhantomJS更快、占用内存更少,而且还有个强大...

    瓦都剋
  • MVC5:使用Ajax和HTML5实现文件上传功能

    引言 在实际编程中,经常遇到实现文件上传并显示上传进度的功能,基于此目的,本文就为大家介绍不使用flash 或任何上传文件的插件来实现带有进度显示的文件上传功能...

    葡萄城控件
  • 数据结构-hash表

    也就是说,它通过把关键码值映射到表中一个位置来访问记录, 以加快查找的速度。这个映射函数叫做哈希函数,存放记录的数组叫做哈希表。

    杨小杰
  • 刚刚,在韩国上演的北京8分钟,中国首次用AI展示国家形象

    李根 发自 SSJQ 量子位 报道 | 公众号 QbitAI ? 时隔14年后,奥林匹克再次进入北京时间。 刚刚结束的平昌冬奥会闭幕仪式上,张艺谋和团队用8分...

    量子位

扫码关注云+社区

领取腾讯云代金券