首页 > 系统 > Linux > 正文

linux中高并发socket最大连接数的优化详解

2019-11-02 16:03:36
字体:
来源:转载
供稿:网友

首先我们可以通过ulimit a命令来查看系统的一些资源限制情况,如下:

# ulimit -acore file size   (blocks, -c) 1024data seg size   (kbytes, -d) unlimitedscheduling priority    (-e) 0file size    (blocks, -f) unlimitedpending signals     (-i) 127422max locked memory  (kbytes, -l) 64max memory size   (kbytes, -m) unlimitedopen files      (-n) 20480pipe size   (512 bytes, -p) 8POSIX message queues  (bytes, -q) 819200real-time priority    (-r) 0stack size    (kbytes, -s) unlimitedcpu time    (seconds, -t) unlimitedmax user processes    (-u) 81920virtual memory   (kbytes, -v) unlimitedfile locks      (-x) unlimited

这里重点关注open filesmax user processes。分别表示:单个进程打开的最大文件数;系统可以申请最大的进程数。

1、查看、修改文件数(当前session有效):

# ulimit -n20480# ulimit -n 20480

2、查看、修改进程数(当前session有效):

# ulimit -u81920# ulimit -u 81920

3、永久设置文件数、最大进程:

可以编辑# vim /etc/security/limits.conf在其中指定最大设置; 或者在/etc/profile文件指定;

一、最大进程数:

最近在Linux服务器上发布应用时碰到一个如下的异常:

Caused by: java.lang.OutOfMemoryError: unable to create new native threadat java.lang.Thread.start0(Native Method)at java.lang.Thread.start(Thread.java:640)

初看可能会认为是系统的内存不足,如果这样想的话就被这段提示带到沟里面去了。上面这段错误提示的本质是Linux操作系统无法创建更多进程,导致出错。因此要解决这个问题需要修改Linux允许创建更多的进程。

1、临时设置:

我们可以使用 ulimit -u 81920 修改max user processes的值,但是只能在当前终端的这个session里面生效,重新登录后仍然是使用系统默认值。

2、永久设置:

1)编辑# vim /etc/security/limits.conf

在文件中添加如下内容:

soft nproc 81920 hard nproc 81920

      注: *表示所有用户,soft、hard表示软限制、硬限制。(软限制<=硬限制)

2)或者在/etc/profile文件中添加:

ulimit -u 81920

这样每次用户登录就可以设置最大进程数。

二、最大打开文件数:

最大文件打开数在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。

1、查看最大打开文件数:

$ ulimit -n1024

这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进程必然打开的标准输入,标准输出,标准错误,服务器监听 socket,进程间通讯的unix域socket等文件,那么剩下的可用于客户端socket连接的文件数就只有大概1024-10=1014个左右。也就是说缺省情况下,基于Linux的通讯程序最多允许同时1014个TCP并发连接。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表