关于循环Socket创建超Linux文件句柄限制现象分析

news2024/9/19 21:58:48

项目场景:

在操作系统的世界中万物皆文件。之前拜读过一些作品:针对于socket的创建,Linux也相应创建文件(专业术语中也称文件句柄),于是,我想做一些关于极限的操作,看看这些极限操作会出现什么样的报错,以及相应的解决方案是什么。


问题描述

博主的主语是Java,所以,用Java编写一段程序试试看,观察观察:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;

public class FileOpenTest{
    public FileOpenTest() throws Exception{
    }

    public static void main(String[] args) throws Exception{
        int numberOfSockets = 189412;
        Socket[] sockets = new Socket[numberOfSockets];

        for(int i = 0; i < numberOfSockets; ++i) {
            try {
                int port = 8000 + i;
                sockets[i] = new Socket();
                sockets[i].connect(new InetSocketAddress("198.1.108.211", 22));
                System.out.println("Socket " + i + " connected to port " + port);
                System.out.println(i);
            } catch (IOException var5) {
                IOException e = var5;
                e.printStackTrace();
                Thread.sleep(Integer.MAX_VALUE);
                return;
            }
        }

    }
}

部署到服务器198.1.108.210,运行程序后报以下错误:

java.net.SocketException: Too many open files
at java.base/java.net.Socket.createImpl(Socket.java:479)
at java.base/java.net.Socket.connect(Socket.java:606)
at java.base/java.net.Socket.connect(Socket.java:557)
at FileOpenTest.main(FileOpenTest.java:17)

另外,同样的代码在windows上的报错如下:
创建了有16288个socket,跟Linux上的限制数值不一样,这应该是windows的设置。
在这里插入图片描述


原因分析:

于是博主先顺藤摸瓜,找找网上对应的解决方案,最终找到了一篇比较满意的答案。参考
阅读原文之后并实践之后,发现是Linux操作系统这个硬限制参数限制了:
文件句柄限制:

#硬限制
ulimit -Ha
#软限制
ulimit -a 
ulimit -Sa

至于硬软限制的区别,网上说是软限制仅会发出警告,而硬限制则会报错


解决方案:

提示:这里填写该问题的具体解决方案:

例如:新建一个 Message 对象,并将读取到的数据存入 Message,然后 mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();换成 mHandler.sendMessage()
文章中提到的解决方案是修改/etc/security/limits.conf文件,在文件末尾添加如下设置并重新打开窗口运行程序
*代表所有用户

* soft nofile 655350
* hard nofile 655350

我分别仅设置

* soft nofile 5000

或者

* hard nofile 5000

发现真正受影响的参数的设置是后者-硬限制
其实这也正跟软硬限制的区别符合。

日常排查:

#查看当前系统打开的文件数
cat /proc/sys/fs/file-nr
#监控当前系统打开的文件数(每1秒更新一次)
watch -n 1 cat /proc/sys/fs/file-nr
#查看打开进程打开的文件数(倒叙)
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
#根据lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more取排在最前的进程,进而得到是哪个进程的具体描述,如下例子是1612进程
ps aux|grep 1612
#可结合下面的命令分析
#查看操作系统给改进程的硬限制值分析
cat /proc/1612/limits
#查看进程持有的句柄数,若值大于cat /proc/1612/limits中的设置,基本可以确定问题所在
ls  /proc/1612/fd/|wc -l
#查看进程持有的句柄数,若值大于cat /proc/1612/limits中的设置,基本可以确定问题所在
cat /proc/1612/limits |grep "open"

虽说上面的Linux操作系统级别的调优可以解决,但是我们首先更应该关注的是业务代码是否编写合理,就比如我上面的代码块,并没有资源关闭(为了极限测试)。否则,即使调优了,那也只会白白浪费资源。

其他参考命令:

查看当前系统支持打开的最大句柄数:more /proc/sys/fs/file-max
统计各进程打开句柄数:lsof -n|awk{print $2}|sort |uniq -c|sort -nr
统计各用户打开句柄数:lsof -n|awk{print $3}|sort |uniq -c|sort -nr
统计各命令打开句柄数:lsof -n|awk{print $1}|sort |uniq -c|sort -nr
查看当前进程实时打开的文件数:lsof -p 进程PID | wc -l
查看某个进程的句柄数限制:cat /proc/进程ID/limits
查看系统限制的最大文件打开数:cat /proc/sys/fs/file-max
查看系统当前已使用的文件句柄数:cat /proc/sys/fs/file-nr

参考
参考

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

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

相关文章

优化数据的抓取规则:减少无效请求

在爬取房价信息的过程中&#xff0c;如何有效过滤无效链接、减少冗余请求&#xff0c;是提升数据抓取效率的关键。本文将介绍如何优化爬虫抓取贝壳等二手房平台中的房价、小区信息&#xff0c;并通过代理IP、多线程、User-Agent和Cookies的设置&#xff0c;确保数据抓取的稳定性…

聊聊Netty对于内存方面的优化

写在文章开头 Netty通过巧妙的内存使用技巧尽可能节约内存空间,进而减少java中Full gc的STW的时间,由此间接的提升了程序的性能,本文也将直接从源码的角度分析一下Netty对于内存方面的使用技巧,希望对你有所启发。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java…

解决Filament中使用ARCore出现绿色闪屏的问题

解决Filament中使用ARCore出现绿色闪屏的问题 问题现象 使用AR的工程中&#xff0c;出现绿屏闪烁。问题帧截图如下&#xff1a; 问题定位 问题来源 在filament的1.21.0之前的版本&#xff0c;Stream对象提供了stream(long externalTextureId)方法&#xff0c;允许传递一个…

U盘显示未被格式化:深度解析与数据恢复指南

一、现象解析&#xff1a;U盘显示未被格式化之谜 在日常使用U盘的过程中&#xff0c;不少用户可能会遭遇一个令人头疼的问题——插入U盘后&#xff0c;系统提示“U盘未被格式化”&#xff0c;要求用户进行格式化操作以继续访问。这一突如其来的提示不仅打断了正常的工作流程&a…

[邀请函]2024上海工博会,盟通邀您共享盛典!

展会基本情况 9月24-28日&#xff0c;2024年中国国际工业博览会&#xff08;简称"中国工博会"&#xff09;将在国家会展中心&#xff08;上海&#xff09;拉开帷幕。展会设9大专业展&#xff0c;数控机床与金属加工展、工业自动化展、节能与工业配套展、新一代信息技…

数据结构——链表(短小精悍版)

使用链表结构可以克服数组链表需要预先知道数据大小的缺点 链表结构可以充分利用计算机内存空间&#xff0c;实现灵活的内存动态管理。 但是链表失去了数组随机读取的优点&#xff0c;同时链表由于增加了结点的指针域&#xff0c;空间开销比较大。 单向链表&#xff1a; 一个…

MiniCPM3-4B | 笔记本电脑运行端侧大模型OpenBMB/MiniCPM3-4B-GPTQ-Int4量化版 | PyCharm环境

MiniCPM3-4B&#xff0c;轻松在笔记本电脑上运行大模型&#xff1f; 背景一、选择模型二、模型下载三、模型运行四、总结 背景 2024年9月5日&#xff0c;面壁智能发布了MiniCPM3-4B&#xff0c;面壁的测试结果声称MiniCPM3-4B表现超越 Phi-3.5-mini-instruct 和 GPT-3.5-Turbo-…

MSF的使用学习

一、更新MSF apt update # 更新安装包信息&#xff1b;只检查&#xff0c;不更新&#xff08;已安装的软件包是否有可用的更新&#xff0c;给出汇总报告&#xff09; apt upgrade # 更新已安装的软件包&#xff0c;不删除旧包&#xff1b; apt full-upgrade # 升级包&#x…

HashMap高频面试知识点

HashMap HashMap是基于hash表的一种数据结构&#xff0c;用于存放键值对&#xff0c;核心就是把hash值映射到数组的索引位&#xff0c;通过数组链表&#xff08;JDK1.8开始通过数组链表红黑树&#xff09;解决Hash冲突。 因为当hash冲突较多时&#xff0c;链表中元素增加&#…

C语言进阶【4】---数据在内存中的存储【1】(你不想知道数据是怎样存储的吗?)

本章概述 整数在内存中的存储大小端字节序和字节序判断练习1练习2练习3练习4练习5练习6 彩蛋时刻&#xff01;&#xff01;&#xff01; 整数在内存中的存储 回忆知识&#xff1a;在讲操作符的那章节中&#xff0c;对于整数而言咱们讲过原码&#xff0c;反码和补码。整数分为有…

JAVA同城生活新引擎外卖跑腿团购到店服务多合一高效系统小程序源码

&#x1f680;同城生活新风尚&#xff01;一站式高效系统&#xff0c;让日常更便捷&#x1f6cd;️ &#x1f37d;️【开篇&#xff1a;同城生活&#xff0c;一触即发】&#x1f37d;️ 在这个快节奏的时代&#xff0c;同城生活的便利性与效率成为了我们追求的新风尚。想象一下…

C++ —— 关于vector

目录 链接 1. vector的定义 2. vector的构造 3. vector 的遍历 4. vector 的扩容机制 5. vector 的空间接口 5.1 resize 接口 5.2 push_back 5.3 insert 5.4 erase 5.5 流插入与流提取 vector 并不支持流插入与流提取&#xff0c;但是可以自己设计&#xff0c;更…

[NSSCTF 2022 Spring Recruit]ezgame

打开题目环境是一个游戏: 直接F12开始审计源代码&#xff1a; 这里说拿到65分以后可以得到flag&#xff0c;这里因为游戏太菜选择直接篡改分数&#xff1a; 在控制台输入scorePoin10000就可以改变当次得分&#xff0c;等到游戏结束就能得到flag。

心觉:成功学就像一把刀,有什么作用关键在于使用者(二)

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作174/1000天 上一篇文章讲了成功学到底是个啥 是如何起作用的 为什么有些人觉得没有用&#xff1f; 今天我们再展开来剖析一下这…

链表--(1)链表的概念

前言引入 之前我们学习了数组这一概念,使用数组可以在编程时增加程序的灵活性。但在c语言中不允许定义动态数组的类型也不能随意调整数组的大小,往往会导致内存空间的浪费。由此我们推出链表。链表是动态进行内存分配的一种结构,它可以随时为其结点分配需要的存储空间也方便…

Vscode搭配latex简易教程

1. 找镜像网站下载texlive的iso文件 清华源镜像 下载之后直接打开iso文件&#xff0c;打开install-tl-windows.bat文件&#xff0c;进行安装即可&#xff0c;安装大概30分钟左右 2. VScode端配置 2.1 下载这三个插件 2.2 打开设置 2.3 追加内容到配置json文件当中 // Latex…

《深入理解JAVA虚拟机(第2版)》- 第12章 - 学习笔记

第12章 Java内存模型与线程 12.1 概述 TPS是用来衡量一个服务性能好坏高低的重要指标值。TPS是Transactions Per Second的缩写&#xff0c;用来表示每秒事务处理数&#xff0c;即服务端每秒平均能碰响应的请求数。 12.2 硬件的效率与一致性 处理器与内存的运算效率差了好几…

使用阿里OCR身份证识别

1、开通服务 免费试用 2、获取accesskay AccessKeyId和AccessKeySecret 要同时复制保存下来 因为后面好像看不AccessKeySecret了 3.Api 参考 https://help.aliyun.com/zh/ocr/developer-reference/api-ocr-api-2021-07-07-recognizeidcard?spma2c4g.11186623.0.0.7a9f4b1e5C…

园区网基础组网保姆级(mstp,vrrp,irf,eth-trunk,route-policy,ospf,bgp,rbm,nat,mlag等等)

本文实验使用模拟器:H3C HCL 5.10.2版本 一、园区核心/接入架构1.1.三层架构1.2.二层架构二、园区核心 To 接入实践2.1.MSTP+VRRP派系2.1.1.MSTP+VRRP配置2.1.2.MSTP+VRRP验证2.2.IRF+Eth-Trunk派系2.2.1.IRF+Eth-Trunk配置2.3.两种派系的对比2.4.VXLAN结构三、园区核心/出口架…

观《中国数据库前世今生》有感:从历史中汲取未来的力量

观《中国数据库前世今生》有感&#xff1a;从历史中汲取未来的力量 中国数据库技术的起步与发展 观看了《中国数据库前世今生》后&#xff0c;我对于中国数据库技术的历史变迁有了更深刻的理解。作为一名有一年开发经验的程序员&#xff0c;这部纪录片让我对中国数据库行业从8…