2019.12.23(关键词:Socket)

概述

  • LinkedIn 的即时消息:在一台机器上支持几十万条长连接
  • 一篇搞懂TCP、HTTP、Socket、Socket连接池

LinkedIn 的即时消息:在一台机器上支持几十万条长连接

  • Socket 等待限制

** net.core.somaxconn,通过该参数可以控制程序接受的处于等待中的最大的TCP连接数量(存疑)。**

  • JVM 线程数量限制

Java 是多线程的,每当有一个请求到达的时候,就会新开一个线程进行处理。一个线程的栈大小决定了可以用 来做静态内存分配的内存量。这样,理论上的最大线程数量就是一个进程的用户地址空间大小除以线程的栈大小。不过,实际上 JVM 也会把内存用于堆上的动态分配。在用一个小 Java 程序做了一些简单实验之后,我们证实了如果堆分配的内存多,那栈可以用的内存就少。这样,线程数量的限制会随着堆大小的增加而减少。结论就是,如果你想增加线程数量限制,你可以减少每个线程使用的栈大小(-Xss),也可以减少分配给堆的内存(-Xms,-Xmx)

  • 临时端口耗尽

来自客户端的请求通常是打到负载均衡服务器上的,负载均衡服务器需要和对应的下游服务节点进行通信,因此,负载均衡服务器会新开一个临时端口,之所以叫做临时端口,是因为在这个连接的生命周期内,该端口都会与之关联,一旦连接终止,就会释放该端口。而长连接一直不会断开,因此端口得不到释放,可能会出现负载均衡服务器端口耗尽的问题。

  • 文件描述符

Unix系统遵循一切都是文件的理念。因此,比如Socket,一个Socket 也对应了一个文件句柄,通过ulimit -n 可以查看当前用户可使用的文件数。通过 cat /proc/{pid}/limits 可以查看到单个进程最多可以打开的文件数。如果要针对单个进程可打开的最大文件数进行修改的话,可以修改文件 /etc/security/limits.conf 。此外,还有一个系统级别的设置/etc/sysctl.conf - fs.file-max

  • JVM 堆