Linux 最大可以打开多少文件描述符?

news2024/10/6 14:28:12

Linux 最大可以打开多少文件描述符?

在日常开发中,对文件的操作可谓是再寻常不过的意见事情。那么你是否有这样一个疑问, 我最多可以打开多少个文件呢?

在Linux系统中,当某个程序打开文件时,内核返回相应的文件描述符。 文件描述符(fd: file descriptors),也就是所谓的文件句柄,程序为了处理该文件必须引用此描述符。

文件描述符是大于等于0的整数,其可以标明每一个被进程所打开的文件和 socket。最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出(stdout)和标准错误(stderr)对应,后面打开的文件依此类推对应 3、4…… 。

从文件描述符的描述中得知,其是按照每个进程来分配的。于是上面的问题"我最多可以打开多少个文件"就可以进一步细化为下面几个问题

  • 一个进程最多可以打开多少个文件描述符
  • 一个用户最多可以打开多少个文件描述符
  • 一个系统最多可以打开多少个文件描述符

顺着这样的思路,下面就开始进行探索。

一个进程最多可以打开多少个文件描述符?

下面的代码是一个用于测试能最多可以打开多少文件描述符的方法。

//g++ main.cpp -o main
#include <iostream>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <climits>
int main(){
    size_t MAX= UINT_MAX;
    for(int i = 0; i < MAX; ++i){
        int fd = open("./file.txt",O_RDWR);
        if(-1 == fd){
            fprintf(stderr,"open file %d  stderr, %s\n", i , strerror(errno));
            std::cin.get();
            exit(1);
        }
    }
}

使用std::cin.get()开在了程序退出前,目的是为了去/proc文件系统下查看最大的文件描述符。使用下面的命令就可以得到运行的程序所打开的最大的文件描述符。

ls /proc/<process id>/fd | sort -n | tail -n 1
1023

在我的测试环境中,上面的命令输出了1023。由于文件描述符是从0开始算起的,因此,实际上该进程最大打开了1024个文件描述符。

那么这个限制是在哪里的呢?

Linux ulimit命令用于控制shell程序的资源。 ulimit为shell内建指令,可用来控制shell执行程序的资源。

ulimit -n即可查看当前允许打开的最大的文件描述符数量。

尝试修改最大的文件描述符数量:

[root@localhost ~]# ulimit -n 10240
[root@localhost ~]# ulimit -n
10240

这样我们再次运行上面的程序进行测试:

[root@localhost ~]# ls /proc/44570/fd | sort -n | tail -n 1
10239

这个时候就发现系统可以打开的文件描述符数量已经达到了10239个。

上面我们通过ulimit -n成功的将当前进程可以打开的文件描述符提高到了10240个。 那么我们最多可以设置到多少呢?总不能可以无限制的修改下去把。

答案藏在Linux的nr_open文件中,nr_open用于限制单个进程可以分配的最大文件描述符,该限制对于系统上所有用户下所有进程都生效,查看当时如下:

cat /proc/sys/fs/nr_open
1073741816

在我的系统中,如果设置了一个比nr_open更大的值将会抛出错误。

[root@localhost ~]# ulimit -n 10000000000
-bash: ulimit: open files: cannot modify limit: Operation not permitted

在上面的过程中,我们修改进程可以打开文件描述符的上限是使用ulimit命令,但是ulimit命令更改后只是在当前会话生效,当退出当前会话重新登录后又会回到默认值1024,要永久更改则需要修改文件 /etc/security/limit.conf

limit.conf中可以设置很多与用户限制相关的内容。

其格式如下所示:

#<domain>        <type>  <item>  <value>
  • domain: 代表限制的对象,对哪些用户生效。其可以是一个用户名,也可以是一个用户组的名字,可以使用通配符*和%。
  • type: 仅仅有两种, soft和hard。 soft的限制的值不能超过hard限制的值。
  • item: 代表可以限制的内容, 可以有下面的一些选项可以设置
    • core - 显示coredump文件的大小 (单位KB)
    • data - 最大数据大小 (单位KB)
    • fsize - 最大文件大小 (单位KB)
    • memlock - 最大锁定内存地址空间 (单位KB)
    • nofile - 最大可以打开的文件描述符的数量
    • rss - 最大驻留集大小 (单位KB)
    • stack - 最大栈的大小 (KB)
    • cpu - 最多CPU占用时间,单位为MIN分钟
    • nproc - 最大可以打开的进程数量
    • as - 地址空间限制 (KB)
    • maxlogins - 用户可以同时登录的最大数量
    • maxsyslogins - 系统最大允许的登录数量
    • priority - 运行用户进程的优先级
    • locks - 用户可以持有的文件锁的最大数量
    • sigpending - 最大挂起信号数
    • msgqueue - POSIX 消息队列使用的最大内存 (单位 bytes)
    • nice - 允许的最大优先级提高到值 [-20,19]
    • rtprio - 最大实时优先级
  • value: 就是为item设置的具体的数值。

我们的需求是设置文件描述符的上限,因此item就是nofile。

加入下面的语句

tom hard nofile 10240"

其含义是tom用户创建的每个进程的打开的最大的文件描述符数量不能超过硬限制10240。

这里顺便再提一下soft和hard的区别, 达到 soft 限制会在系统的日志(一般为/var/log/messages)里面记录一条告警日志,但不影响使用。hard,达到这个限制,有日志且会影响使用。

因此hard limit才是真正的限制。

从这样的实验中我们得出了结论:

一个进程可以打开的文件描述符小于 < hard limit < nr_open

process open fd

但是这里其实还有操作系统的资源的隐含限制,虽然你可以将进程的最大描述符设置的非常大,然而打开一个文件描述符是需要消耗一定的内存的,当文件描述打开非常多时,可能就会出现OOM的状况。 因此实际进程能打开的文件描述符可能还受内存资源的限制。

一个用户最多可以打开多少个文件描述符

实际上一个用户可以打开的最大文件描述符 = (用于打开的最大进程数) * (每个进程最大可以打开的文件描述符数量)

每个进程可以打开的文件描述符数量在第一个问题中已经得到了解决。

那么这个问题就变成了一个用户最多可以打开多少个进程。

其中ulimit -u就可以设置当前shell可以打开的进程数量。

如果需要永久更改,则还是通过更改limits.conf文件。

方案一: 修改/etc/security/limits.conf文件, 在文件最后添加下述内容:

*  soft      nproc      131072
*  hard      nproc      131072

方案二: 修改/etc/security/limits.d/90-nproc.conf文件, 在文件最后添加下述内容:

# 用户进程数的默认限制, 下面这个是对root外的其他用户限制max user processes, 要注释掉: 
# *          soft    nproc     1024
root       soft    nproc     131072

对max user processes的配置, Linux系统默认先读取/etc/security/limits.conf 中的信息, 如果/etc/security/limits.d/目录下还有配置文件的话, 也会依次遍历读取, 最终, /etc/security/limits.d/中的配置会覆盖/etc/security/limits.conf 中的配置。

除上述限制以外,操作系统还有一个全局的限制,pid_max,用于设置操作系统可以打开的进程的总数量。

cat /proc/sys/kernel/pid_max

知道了这些限制之后,一个用户最多可以打开多少个文件描述符也迎刃而解了。

一个系统最多可以打开多少个文件描述符

操作系统对于文件描述符有一个全局的限制, 其定义在/proc/sys/fs/file-max中,例如在我的系统中,其值如下所示:

cat /proc/sys/fs/file-max
9223372036854775807

总结

  • 一个进程可以打开的文件描述符的数量小于hard limit,而hard limit的值要小于nr_open。但是实际能打开的文件描述符的最大数量还和系统资源有关。
  • 一个用户可以打开的文件描述符数量等于一个进程可以打开的文件描述符的数量* 一个用户最大可以打开的进程数量。
  • 一个系统可以打开的文件描述符数量即所有用户的所有进程打开的文件描述符总数量受file-max限制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1116321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL查询命令互转vba格式

最近搞个Excel的vba查询数据库&#xff0c;发现vba有代码行长度限制需要转换下就弄了这个&#xff0c;布局和功能暂且这样了&#xff0c;哪位大佬如果有兴趣的可以再美化下&#xff01; 这次更新了SQL命令互转VBA格式&#xff0c; SQL原始格式要分行的不能一坨贴进去&#xff0…

Java日志系统之JUL

目录 JUL介绍 JUL的使用 日志级别 指定日志输出地址 Logger对象的父子关系 Logger读取配置文件 JUL介绍 Java自带的框架&#xff0c;使用简单&#xff0c;无需引入依赖 JUL的使用 public class JULTest {Testpublic void testLogger() throws Exception{//获取日志记录…

2 用TensorFlow构建一个简单的神经网络

上一篇&#xff1a;1 如何入门TensorFlow-CSDN博客 环境搭建 后续介绍的相关代码都是在pycharm运行&#xff0c;pycharm安装略。 打开pycharm&#xff0c;创建一个新的项目用于tensorflow编码练习&#xff0c;在Terminal输入命令&#xff1a; # 依赖最新版本的pip pip inst…

[AutoSAR系列] 1.2 AutoSar 综述

AutoSAR是一种汽车工业领域的标准化软件架构,旨在简化不同汽车制造商之间的软件开发和交互。该标准于2003年由一系列欧洲汽车制造商成立的AutoSAR联盟制定并发布,目前已经成为全球范围内的标准。下面将对AutoSAR的概念、架构和实现进行综述。 1. 概述 AutoSAR是汽车电子控制…

Qt 读写文件(QFileQTextStreamQDataStream) 详解

一、读写文本文件 (QFile 类) Qt QFile类是一个用于读取和写入文件的类&#xff0c;它提供了对文件的访问、读取和写入等操作。它既可以操作文本文件&#xff0c;也可以操作二进制文件。 QFile类的功能包括&#xff1a; 打开、关闭文件读取文件内容写入文件内容支持文本模式…

如何让ChatGPT生成图片?

目录 一、那么如何解决让ChatGPT具有画图能力的问题呢&#xff1f; 二、那ChatGPT为什么能生成图片呢&#xff1f; 我们都知道ChatGPT只是个纯文本的AI模型&#xff0c;不具备画图能力。它可以生成文本&#xff0c;但如果让他生成图片就会显示如下的声明&#xff1a; 但通过本…

前端多媒体处理工具——ffmpeg的使用

写在前面 在前端领域&#xff0c;FFmpeg 是一个非常有用的工具&#xff0c;它提供了多种媒体格式的封装和解封装&#xff0c;包括多种音视频编码、多种协议的流媒体、多种色彩格式转换、多种采样率转换、多种码率切换等。可以在多种操作系统安装使用。 安装 下载FFmpeg 在网…

服务器数据恢复-某银行服务器硬盘数据恢复案例

服务器故障&分析&#xff1a; 某银行的某一业务模块崩溃&#xff0c;无法正常使用。排查服务器故障&#xff0c;发现运行该业务模块的服务器中多块硬盘离线&#xff0c;导致上层应用崩溃。 故障服务器内多块硬盘掉线&#xff0c;硬盘掉线数量超过服务器raid阵列冗余级别所允…

文件目录(文件控制块FCB,目录结构,索引结点)

1.文件控制块&#xff08;实现文件目录的关键数据结构) 目录文件中的一条记录就是文件控制块&#xff08;FCB&#xff09; FCB的有序集合称为“文件目录”&#xff0c;一个FCB就是一个文件目录项。 1.FCB的组成 FCB中包含了文件的基本信息&#xff08;文件名、物理地址、逻…

墨迹天气商业版UTF-8模板,Discuz3.4灰白色风格(带教程)

1.版本支持&#xff1a;Discuzx3.4版本&#xff0c;Discuzx3.3版本&#xff0c;DiscuzX3.2版本。包括网站首页&#xff0c;论坛首页&#xff0c;论坛列表页&#xff0c;论坛内容页&#xff0c;论坛瀑布流,资讯列表页(支持多个)&#xff0c;产品列表页(支持多个)&#xff0c;关于…

【TES600】青翼科技基于XC7K325T与TMS320C6678的通用信号处理平台

板卡概述 TES600是一款基于FPGA&#xff0b;DSP协同处理架构的通用高性能实时信号处理平台&#xff0c;该平台采用1片TI的KeyStone系列多核浮点/定点DSP TMS320C6678作为主处理单元&#xff0c;采用1片Xilinx的Kintex-7系列FPGA XC7K325T作为协处理单元&#xff0c;具有1个FMC…

Android Studio(2022.3.1)设置阿里云源-新旧版本

新版本 #settings.gradle.ktsmaven { url uri("https://maven.aliyun.com/repository/public/") }maven { url uri("https://maven.aliyun.com/repository/google/") }maven { url uri("https://maven.aliyun.com/repository/jcenter/") }ma…

VBA操作数据库

相关背景&#xff1a; 对于数据分析同学&#xff0c;一般SQL&#xff0c;EXCEL是必备技能&#xff0c;但对于VBA和Python可能有的同学不会&#xff1b;在处理本地数据上(诸如excel、txt|csv文本&#xff09;&#xff0c;后续尝试使用VBA或者Python写一个sql查询的GUI界面&…

dubbogo-1 基础rpc服务

文章目录 基本环境处理编译pb接口开启rpc调用业务观察qa1 能取出protoc里面的字段值吗&#xff1f; 基本环境处理 https://cn.dubbo.apache.org/zh-cn/overview/quickstart/go/install/ 这里没有 protoc-gen-go --version 执行 go get -u github.com/golang/protobuf/protoc…

嵌入式养成计划-45----QT--事件机制--定时器事件--键盘事件和鼠标事件--绘制事件

一百一十五、事件机制 当这件事情发生时&#xff0c;会自动走对应的函数处理&#xff08;重写的事件函数&#xff09; 115.1 事件处理简介 什么是事件&#xff1f; (重点) 件是由窗口系统或者自身产生的&#xff0c;用以响应所发生的各类事情&#xff0c;比如用户按下并释放…

vscode调试技巧 断言 assert

目录 调试技巧标题debug release介绍调试技巧断点 断点的意思 就是代码执行到断点处停下来&#xff0c;让你去调试。不管前面有多少代码&#xff0c;直接跳到断点处&#xff08;当然前面的已经执行&#xff09;逐过程 不会进入调用函数内部&#xff0c;不管里面怎么执行。 逐语…

精讲stable diffusion的controlNet插件

controlNet插件是stable diffusion的一个重要插件&#xff0c;甚至可以说正是因为有了controlNet插件&#xff0c;stable diffusion才会具有midjourney所不具备的独特魅力&#xff01; 我们今天就一起来学习下controlNet插件的安装和每个模型的用法 插件主页 独立的controlN…

MSP430F5529时钟系统配置

1、为什么要进行时钟管理&#xff1f;   时钟系统是一个数字器件的命脉&#xff0c;对于普通的51单片机来说&#xff0c;它的时钟来源只有外部晶振&#xff0c;然后每12个振荡周期完成一个基本操作&#xff0c;所以也叫做12T单片机&#xff0c;但对于当前高级一点的单片机来…

牛客:NC59 矩阵的最小路径和

牛客&#xff1a;NC59 矩阵的最小路径和 文章目录 牛客&#xff1a;NC59 矩阵的最小路径和题目描述题解思路题解代码 题目描述 题解思路 动态规划&#xff0c;递推公式&#xff1a;matrix[i][j] min(matrix[i-1][j], matrix[i][j-1]) 题解代码 func minPathSum( matrix [][…

性能压测工具 —— wrk

一般我们压测的时候&#xff0c;需要了解衡量系统性能的一些参数指标&#xff0c;比如。 1、性能指标简介 1.1 延迟 简单易懂。green:一般指响应时间 95线&#xff1a;P95。平均100%的请求中95%已经响应的时间 99线&#xff1a;P99。平均100%的请求中99%已经响应的时间 平…