RK3588 linux 修改ulimit 配置

在这里插入图片描述

前言

在这里插入图片描述

ulimit 主要是用来限制进程对资源的使用情况的,它支持各种类型的限制,常用的有:

  • 内核文件的大小限制
  • 进程数据块的大小限制
  • Shell进程创建文件大小限制
  • 可加锁内存大小限制
  • 常驻内存集的大小限制
  • 打开文件句柄数限制
  • 分配堆栈的最大大小限制
  • CPU占用时间限制用户最大可用的进程数限制
  • Shell进程所能使用的最大虚拟内存限

源于一次粗心大意, 编写的程序忘记了关闭打开的文件, 导致文件打开失败, 失败的原因是打开的文件太多

测试代码

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <csignal>
#include <errno.h>

void signt_handle(int s){
    printf("%s\n", __FUNCTION__);
    exit(0);
}

int main(int argc, char** argv) {
    printf("[I]%s.START....\n", __FUNCTION__);
    std::signal(SIGINT, signt_handle);

    bool close = false;
    int num = 0;

    for(int i = 0; i < argc; i ++){
        printf("[D]%s arg:%s\n", __FUNCTION__, argv[i]);
        char* val = nullptr;
        if((val = strstr(argv[i], "num=")) != nullptr){
            num = atoi(val + 4);
        }else if(strcmp(argv[i], "close") == 0){
            close = true;
        }
    }

    for(int i = 0; i < num; i ++){
        FILE* fp = fopen("/bootTime", "r");
        if(fp != nullptr){
            printf("[D]%s.open %d\r", __FUNCTION__, i);
            //open success.
        }else{
            printf("[E]%s open %d failed: %d(%s)!\r", __FUNCTION__, i, errno, strerror(errno));
        }
        if(close)fclose(fp);
    }
    printf("\n");

    char c = getc(stdin);
    //while((c = getc(stdin)) != 'q');

    printf("[I]%s.FINISH....\n", __FUNCTION__);
}

报错 open failed: 24(Too many open files)

查看系统限制:

//查看所有的限制信息
$userdata# ulimit -a
real-time non-blocking time  (microseconds, -R) unlimited
core file size              (blocks, -c) 0
data seg size               (kbytes, -d) unlimited
scheduling priority                 (-e) 0
file size                   (blocks, -f) unlimited
pending signals                     (-i) 63277
max locked memory           (kbytes, -l) 64
max memory size             (kbytes, -m) unlimited
open files                          (-n) 1024
pipe size                (512 bytes, -p) 8
POSIX message queues         (bytes, -q) 819200
real-time priority                  (-r) 0
stack size                  (kbytes, -s) 8192
cpu time                   (seconds, -t) unlimited
max user processes                  (-u) 63277
virtual memory              (kbytes, -v) unlimited
file locks                          (-x) unlimited

//查看文件打开个数信息
$userdata# ulimit -n
1024

系统的文件打开数量限制为1024, 简单测试打开1025个文件:

# /userdata/test_ulimit num=1025
[I]main.START....
[D]main arg:/userdata/test_ulimit
[D]main arg:num=1025
[E]main open 1024 failed: 24(Too many open files)!
q
[I]main.FINISH....

再进程未结束是, 可以从lsof 可以看出当前进程打开的文件:

$ adb shell lsof | grep test_
16363	/userdata/test_ulimit	0	/dev/console
16363	/userdata/test_ulimit	1	/dev/console
16363	/userdata/test_ulimit	2	/dev/console
16363	/userdata/test_ulimit	3	/bootTime
16363	/userdata/test_ulimit	4	/bootTime
//中间省略N行.
16363	/userdata/test_ulimit	1026	/bootTime
16363	/userdata/test_ulimit	1027	/bootTime

如何解决

  1. 及时关闭文件, 避免文件数量超出, 上面的程序增加了close参数, 用于及时关闭文件
  2. 修改系统文件打开数量的限制:
ulimit -n 2048

RK3588 buildroot 修改默认配置

1.无效的尝试

  • /etc/security/limits.conf

            # 添加如下的行
            * soft noproc 11000
            * hard noproc 11000
            * soft nofile 4100
            * hard nofile 4100 
    
  • /etc/init.d/rcS

    在这个启动脚本中,你可以将 ulimit -n 4096 放在 for 循环之前,确保在启动所有 init.d 脚本之前设置 ulimit。这样可以确保在执行任何其他初始化操作之前设置了最大打开文件数。

    所以你可以将 ulimit -n 4096 添加在 for 循环之前,类似这样:

    #!/bin/sh
    
    # Set maximum number of open files
    ulimit -n 4096
    
    # Start all init scripts in /etc/init.d executing them in numerical order.
    for i in /etc/init.d/S??* ;do
        # Ignore dangling symlinks (if any).
        [ ! -f "$i" ] && continue
        case "$i" in
            *.sh)
                # Source shell script for speed.
                (
                    trap - INT QUIT TSTP
                    set start
                    . $i
                )
                ;;
            *)
                # No sh extension, so fork subprocess.
                $i start
                ;;
        esac
    done
    
    

    这样做可以确保在执行其他初始化脚本之前设置了 ulimit

  1. 有效的修改:
  • /etc/profile

    /etc/profile 是一个系统范围的 Shell 配置文件,用于设置系统中所有用户的环境变量和执行一些全局的 Shell 初始化任务。这个文件通常用于 Bourne-compatible shells(例如 Bash、Dash、Korn shell 等)。

    当用户登录时,Shell 会首先读取 /etc/profile 文件,然后再读取用户的个人配置文件(如 ~/.bash_profile~/.profile)。因此,/etc/profile 文件中的设置将影响到所有用户的登录 shell。

    /etc/profile 文件中,你可以设置系统范围的环境变量、导入全局的 Shell 函数、执行一些初始化命令等。这对于配置系统范围的默认行为和环境非常有用,例如设置全局的 PATH 变量、umask 值、语言环境等。

    需要注意的是,修改 /etc/profile 文件需要管理员权限,因为它是系统级别的配置文件。任何对该文件的更改都会影响到整个系统的行为,因此需要小心谨慎地修改。

  • /etc/bash.bashrc

    /etc/bash.bashrc 是另一个系统范围的 Bash Shell 配置文件,它与 /etc/profile 类似,但是它是针对 Bash Shell 的。与 /etc/profile 一样,/etc/bash.bashrc 文件也是在用户登录时被执行的。

    与用户级别的 .bashrc 文件类似,/etc/bash.bashrc 文件通常包含了一些 Bash Shell 的配置和初始化命令,用于设置系统范围的 Shell 环境。这些设置通常适用于所有的 Bash Shell 用户。

    /etc/bash.bashrc 文件中,你可以设置系统范围的 Bash Shell 环境变量、定义全局的 Bash 函数、启用或禁用 Bash Shell 的特性等。

    需要注意的是,/etc/bash.bashrc 文件是在 Bash Shell 启动时执行的,而不是用户登录时执行的,因此它可能不会像 /etc/profile 那样被所有类型的 Shell 执行。如果系统中有其他类型的 Shell 用户,它们可能不会执行 /etc/bash.bashrc 文件中的设置。

  • 针对特定进程修改其打开文件的个数限制(来自GPT, 未验证)

    要针对特定进程修改其打开文件的个数限制(ulimit),你可以使用 ulimit 命令结合 sudo 进行修改。但需要说明的是,ulimit 命令通常只能影响当前 shell 及其子进程的限制,对已经运行的进程并不生效。因此,如果你希望修改已经在运行的进程的文件打开数限制,你需要重新启动该进程或者重新登录用户以应用新的限制。

    下面是修改某个进程打开文件数限制的一般步骤:

    1. 确定进程ID(PID):首先,你需要确定你想要修改的进程的PID。你可以使用 ps 命令或者 pidof 命令来查找进程的PID。例如,如果你想要修改PID为1234的进程的限制,你可以执行:

      ps aux | grep <进程名>
      

      或者

      pidof <进程名>
      
    2. 使用 sudo 修改限制:一旦你有了PID,你可以使用 sudo 命令和 ulimit 命令来修改限制。例如,要将打开文件数限制修改为4096,你可以执行:

      sudo prlimit --pid <PID> --nofile=4096:4096
      

      或者

      sudo ulimit -n 4096 -p <PID>
      
    3. 验证更改:修改限制后,你可以使用 ulimit -a 命令检查更改是否已生效。此外,你也可以通过查看进程的 /proc/<PID>/limits 文件来验证限制是否已应用。

    请注意,ulimit 命令对不同的操作系统可能会有些许差异,而 prlimit 命令在一些系统上可能需要安装额外的软件包。确保在执行任何修改之前仔细阅读命令的文档以及系统的相关文档。

  1. 修改buildroot 源码默认配置为9999
$ git diff buildroot/system/skeleton/etc/profile
diff --git a/buildroot/system/skeleton/etc/profile b/buildroot/system/skeleton/etc/profile
index f2907e417..a6f44c6c2 100755
--- a/buildroot/system/skeleton/etc/profile
+++ b/buildroot/system/skeleton/etc/profile
@@ -25,3 +25,6 @@ for i in /etc/profile.d/*.sh ; do
        fi
 done
 unset i
+
+ulimit -HSn 9999

清除, 编译!

参考

  1. ulimit - Set or display resource limits
  2. ulimit最详解
  3. linux ulimit作用
  4. [SOLVED] How to set ulimit at user level?
  5. /etc/security/limits.conf not applied
  6. ulimit 命令详解
  7. ulimit命令说明与用法
  8. 关于skeleton

在 Buildroot 中,skeleton 指的是包含基本文件和目录的目录树,这些文件和目录是运行最小化 Linux 系统所需的基本组件。它通常包括以下文件:

  • /bin/sbin:这些目录包含必要的可执行程序,例如 bashlscpmv
  • /etc:此目录包含各种系统服务的配置文件。
  • /lib/usr/lib:这些目录包含应用程序使用的库。
  • /proc:此目录包含有关正在运行的进程的信息。
  • /sys:此目录包含有关系统硬件的信息。
  • /dev:此目录包含设备节点,用于访问硬件设备。
  • /tmp:此目录用于临时文件。
  • /usr:此目录包含用户安装的程序和文件。

skeleton 通常从模板创建,该模板可以自定义以包含特定于目标系统的其他文件和目录。然后将 skeleton 复制到根文件系统,该文件系统在引导期间挂载在 / 上。

Buildroot skeleton 是创建自定义嵌入式 Linux 系统的有用起点。它提供了一个基本框架,可以轻松扩展以满足项目的特定需求。

使用 Buildroot 中的 skeleton 有以下一些好处:

  • *节省时间和精力。**您无需手动创建运行最小化 Linux 系统所需的所有文件和目录。
  • *确保根文件系统一致且组织良好。**skeleton 为根文件系统提供了一个标准布局,这使得更容易找到文件和目录。
  • *轻松添加自定义包。**只需将自定义包复制到适当的目录即可轻松将其添加到 skeleton 中。

如果您正在使用 Buildroot 开发嵌入式 Linux 系统,我建议使用 skeleton。它将节省您的时间和精力,并使其更容易创建满足您特定需求的系统。

以下是一些可能有用的额外资源:

  • Buildroot 关于 skeleton 的文档:https://buildroot.org/downloads/manual/manual.html
  • 自定义 skeleton 的示例:https://github.com/buildroot/buildroot
  • 关于如何创建自定义 skeleton 的讨论:https://buildroot.org/downloads/manual/manual.html

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何提高直线模组的技术水平?

在工业制造业中&#xff0c;不管我们使用任何机械产品&#xff0c;都有一个共同的出发点&#xff0c;就是能用先进的技术突破其产品的性能及使用性。那么直线模组究竟是用什么技术突破其产品的使用性的呢&#xff1f; 1、优化机械设计&#xff1a;设计过程中应充分考虑模组的结…

OpenCV与AI深度学习 | 实战 | 基于YOLOv9+SAM实现动态目标检测和分割(步骤 + 代码)

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;实战 | 基于YOLOv9SAM实现动态目标检测和分割&#xff08;步骤 代码&#xff09; 0 导 读 本文主要介绍基于YOLOv9SAM实现动态目标检测和分…

微信小程序展示倒计时

html <view class"countdown"> <text>倒计时&#xff1a;</text> <text wx:for"{{countdown}}" wx:key"index">{{item}}</text> </view> ts data: {countdown: [], // 存放倒计时数组 targetTime:…

【个人博客搭建】(8)全局异常处理

1、net 8 webapi 全局异常处理: 在 .NET 8 WebAPI 中&#xff0c;全局异常处理可以通过实现**IExceptionHandler接口或使用IAsyncExceptionFilter接口来完成**。 首先&#xff0c;关于IExceptionHandler接口&#xff0c;它是ASP.NET Core中用于全局异常处理的新抽象。这个接口有…

从小到大输出四个整数(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int a, b, c, d;int t 0;//提示用户&#xff1b;printf("请输入四个整数a b c d&…

C语言趣味代码(一)

C语言相关知识点的博客和大家分享完了&#xff0c;接下来我想开始数据结构相关的博客&#xff0c;在此之前呢&#xff0c;有的小伙伴问过我学完C语言的相关知识&#xff0c;我能干些什么呢&#xff1f;只有刷题吗&#xff1f;这不禁让我反思&#xff1a;在我们学习的过程中&…

【RSGIS数据资源】2001-2022年中国玉米种植分布数据集

文章目录 数据介绍精彩截图2001&#xff5e;2020年中国玉米种植频率分布2001年至2020年研究区域融合数据的平均填充百分比。 数据介绍 2001-2022年中国玉米种植分布数据集&#xff08;CCD-Maize&#xff09;&#xff0c;涵盖中国22个省、市的玉米种植分布图&#xff0c;文件格…

一文搞定 EventLoop、宏任务、微任务

面试官&#xff1a;你了解JavaScript事件循环吗&#xff0c;掌握多少&#xff0c;把你知道的都说一下。 今天我们就来说一下&#xff0c;JavaScript作为一门单线程语言&#xff0c;如何通过事件循环&#xff08;Event Loop&#xff09;和任务队列&#xff08;Task Queue&#…

CTFHUB-技能树-Web前置技能-文件上传(无验证,JS前端验证,前端验证)

CTFHUB-技能树-Web前置技能-文件上传&#xff08;无验证&#xff0c;JS前端验证&#xff0c;前端验证—.htaccess&#xff09; 文章目录 CTFHUB-技能树-Web前置技能-文件上传&#xff08;无验证&#xff0c;JS前端验证&#xff0c;前端验证—.htaccess&#xff09;文件上传无验…

关联规则挖掘(二)

目录 三、FP-增长算法&#xff08;一&#xff09;算法的背景&#xff08;二&#xff09;构造FP-树&#xff08;三&#xff09;生成频繁项集 四、关联规则的评价&#xff08;一&#xff09;支持度和置信度的不足&#xff08;二&#xff09;相关性分析 三、FP-增长算法 &#xf…

C++内存管理——new/delete、operator new/operator delete

内存管理 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)malloc(sizeof(int) * 4);int* pt…

tcp三次握手和四次断开以及tcpdump的基本使用

前言 最近工作中会发现有超时的问题&#xff0c;还有就是在面试的时候很多都要求深入理解TCP/IP协议。突然感觉TCP/IP协议是一个既熟悉&#xff0c;又陌生的技术。又想到上大学的时候&#xff0c;老师说过 网络的圣经&#xff1a;“TCP/IP详解” 卷一 卷二 卷三&#xff0c;三…

IIC总线读取温度湿度传感器数据实验

iic.c #include "iic.h"extern void printf(const char* fmt, ...); /** 函数名 &#xff1a; delay_us* 函数功能&#xff1a;延时函数* 函数参数&#xff1a;无* 函数返回值&#xff1a;无* */ void delay_us(void) //微秒级延时 {unsigned int i 2000;while(i-…

性能工具之emqtt-bench BenchMark 测试示例

文章目录 一、前言二、典型压测场景三、机器准备四、典型压测场景1、并发连接2、消息吞吐量测试2.1 1 对 1&#xff08;示例&#xff09;2.2 多对1&#xff08;示例&#xff09;2.3 1对多&#xff08;示例&#xff09; 五、遇到的问题client(): EXIT for {shutdown,eaddrnotava…

java学习之路-多态

文章目录 目录 文章目录 前言 1.多态 1.1 多态的概念 1.2 多态实现条件&#xff08;重点&#xff09; 多态实现的栗子 1.3重写 重写的规则 重写和重载的区别 1.4静态和动态绑定 1.5向上转型和向下转型 1.向上转型 2.向下转型 1.6多态的优点 前言 本文内容&#xff1a;多…

DHCP是什么意思 路由器中DHCP服务器怎么设置?

概述 DHCP是什么意思&#xff1f;很多朋友在路由器设置中&#xff0c;都会看到有一项“DHCP服务器”设置功能&#xff0c;而很多朋友对这个功能不太了解&#xff0c;也不知道怎么设置。其实&#xff0c;对于普通用户来说&#xff0c;无需去单独设置路由器DHCP服务器功能&#…

李沐46_语义分割和数据集——自学笔记

语义分割 语义分割将图片中的每个像素分类到对应的类别。 实例分割&#xff08;目标检测的进化版本&#xff09; 如果有物体&#xff0c;会区别同一类的不同物体。 语义分割重要数据集&#xff1a;Pascal VOC2012 %matplotlib inline import os import torch import torch…

【强化学习的数学原理-赵世钰】课程笔记(九)策略梯度方法(Policy Gradient Method)

目录 一.policy gradient 的基本思路&#xff08;Basic idea of policy gradient&#xff09; 二.定义最优策略的 metrics&#xff0c;也就是 objective function 是什么 三.objective function 的 gradient 四.梯度上升算法&#xff08;REINFORCE&#xff09; 五.总结 上…

DevExpress WinForms中文教程 - 如何通过UI测试自动化增强应用可靠性?(二)

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

数字工厂管理系统与MES系统有什么区别

随着工业4.0时代的到来&#xff0c;数字化转型已经成为制造企业发展的必然趋势。在这个过程中&#xff0c;数字工厂管理系统和MES管理系统都扮演者至关重要的角色。然而&#xff0c;尽管两者都致力于优化生产流程和提高生产效率&#xff0c;但它们在实际应用、功能定位和系统架…