React 前端导航

Linux调优之通过支持大并发连接

写在前面

在 Linux 系统中,一切皆为文件,无论是设备、目录还是 socket,均以文件形式存在。文件不仅仅是数据存储的实体,更是应用程序与处理对象之间交互的唯一接口。当应用程序对文件进行读写操作时,首先需要执行打开文件的操作,这个过程实际上是在建立进程与文件之间的联系,而句柄的作用则在于唯一标识这种连接。随后对文件的读写操作将由该句柄充当代表。最终关闭文件实际上是释放句柄的过程,也即断开进程与文件之间的连接。

设置最大句柄数量/最大进程数

在Linux生产环境中,通常需要调整文件句柄数的限制。这是因为Linux系统默认设置为1024,也就是说,一个进程最多只能处理1024个socket连接,这显然是不足够的。

文件句柄,又称为文件描述符,在Linux操作系统中,文件类型包括普通文件、目录文件、链接文件和设备文件。文件描述符(File Descriptor)是内核为有效管理已打开文件而创建的索引,它是一个非负整数,通常是小整数,用于标识已打开的文件。所有的IO系统调用,包括对socket的读写操作,都通过文件描述符完成。通过在Linux系统中使用ulimit命令,可以查看一个进程能够打开的最大文件句柄数量,ulimit命令的具体如下:

ulimit -n

ulimit命令是用于查看和修改当前用户进程的基本限制的实用工具,其中-n选项用于检索或设置当前文件句柄数量的限制值,而Linux系统默认设置为1024。虽然在理论上,对于绝大多数应用程序(比如Apache、桌面应用程序)而言,1024个文件描述符已足够使用。然而,对于一些用户基数庞大的高并发应用而言,这显然是不足够的。高并发应用可能面临的并发连接数往往达到十万级、百万级,甚至像腾讯QQ一样达到上亿级。

文件句柄数的不足的时候,这时候单个进程打开的文件句柄数量超过了系统配置的上限时,将出现“Socket/File: Can't open so many files”的错误提示。因此,对于高并发、高负载的应用,必须调整系统参数以适应处理大量连接的并发应用场景,而ulimit提供了设置这两个参数的方式。

ulimit -n 1000000

在上述指令中,通过设置n的值越大,文件句柄的可打开数量就会相应增加。建议以root用户的身份执行此命令以确保权限。然而,ulimit命令存在一个缺陷,它仅能修改当前用户环境的基础限制,因此仅在当前用户环境中有效。具体而言,这意味着在当前终端会话期间的修改是生效的;但一旦用户退出Linux或终止会话,其值就会回到系统默认的1024。此外,在系统重新启动后,文件句柄数量也会恢复为默认值。

为了实现对最大文件描述符数量的永久性修改,可以编辑开机启动文件“/etc/rc.local”并添加如下内容:ulimit -SHn 1000000。这样可以确保在系统启动时设置文件句柄的最大数量。

ulimit -SHn 1000000

在上述示例中,引入了-S和-H两个新的命令选项。其中,选项-S代表软性极限值,而-H表示硬性极限值。硬性极限即为实际限制,即文件句柄数量的最大值为100万,不可超越。与此不同,软性极限值是系统发出警告的阈值,当超过这个极限值时,内核会发出警告。

通过ulimit命令,普通用户可以将软性极限值更改到硬性极限的最大设置值。然而,若要修改硬性极限,必须拥有root用户的权限。要彻底解除Linux系统对文件打开数量的最大限制,可以通过编辑Linux的极限配置文件“/etc/security/limits.conf”来实现。通过修改此文件,添加如下内容:

soft nofile 1000000
hard nofile 1000000

软性极限由soft nofile表示,而硬性极限则通过hard nofile表达。一个实际的例子是,在使用和安装当前非常流行的分布式搜索引擎ElasticSearch时,通常需要修改此文件,以增加文件描述符的最大限制值。在生产环境中运行Netty时,建议修改/etc/security/limits.conf文件,以调整文件描述符的数量限制。

除了调整应用进程的文件句柄上限外,还需修改内核的基本全局文件句柄上限。可以通过编辑/etc/sysctl.conf配置文件进行更改,参考的配置如下:fs.file-max = 2048000和fs.nr_open = 1024000。在这里,fs.file-max表示系统级别的可打开文件句柄的上限,相当于全局的句柄数上限,而这是对整个系统而言的限制,不是针对特定用户的。另一方面,fs.nr_open指定了单个进程可打开文件句柄的数量限制,nofile的值不能超过fs.nr_open的设定值。

 

声明:本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。邮箱:farmerlzj@163.com。 本站原创内容未经允许不得转载,或转载时需注明出处: 内容转载自: React前端网:https://qianduan.shop/blogs/detail/234

#linux

相关推荐

Linux Centos / Ubuntu/Debian 系统安装Apache httpd

Apache是一个常用的免费、开源的Web服务器,可以在Linux系统中安装和配置。在本文中,我们将介绍如何在Linux中安装Apache,并提供一些示例以帮助您开始使用Apache。

linux安装OpenJDK1.8最简单的方式

linux centos7下安装OpenJDK1.8以及如何实现版本切换!