RK3588 linux 修改ulimit 配置

news2024/10/7 16:21:11

在这里插入图片描述

前言

在这里插入图片描述

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

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

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

相关文章

椋鸟数据结构笔记#10:排序·中

文章目录 四、归并排序时间复杂度实现递归实现非递归实现 测试稳定性 五、非比较排序5.1 计数排序时间复杂度实现测试局限性 5.2 桶排序时间复杂度实现测试 5.3 基数排序时间复杂度实现测试局限性 萌新的学习笔记&#xff0c;写错了恳请斧正。 四、归并排序 归并排序是一种非常…

pta L1-063 吃鱼还是吃肉

L1-063 吃鱼还是吃肉 分数 10 全屏浏览 切换布局 作者 陈越 单位 浙江大学 国家给出了 8 岁男宝宝的标准身高为 130 厘米、标准体重为 27 公斤&#xff1b;8 岁女宝宝的标准身高为 129 厘米、标准体重为 25 公斤。 现在你要根据小宝宝的身高体重&#xff0c;给出补充营养的…

java实现识别图片上的文字(OCR识别身份证等证件信息)

利用第三方jar包&#xff0c;实现识别图片上的文字。第三方支持地址&#xff1a;Spire.OCR for Java | 专业的图文识别组件&#xff0c;用以读取图片格式中的文本Spire.OCR for Java 是专为 Java 开发者设计的强大OCR库&#xff0c;提供高效的文字识别功能&#xff0c;能够从图…

Proxy 代理

意图 为其它对象提供一种代理以控制这个对象的访问。 结构 Proxy保存一个引用使得代理可以访问实体&#xff1b;提供一个与Subject的接口相同的接口&#xff0c;使代理可以用来替代实体&#xff1b;控制实体的存取&#xff0c;并可能负责创建和删除它&#xff1b;其他功能依赖…

企业文档知识库建设,数据安全如何保障?

随着现代市场经济的高速发展&#xff0c;企业的竞争优势越来越多体现在人才和科技的优势。而随着员工流动率的提升&#xff0c;随之流失的则是员工积累多年的宝贵工作经验&#xff0c;如果缺乏有效的内部知识库的建设和管理&#xff0c;企业的竞争优势将难以维系。「企业网盘」…

网络管理实验三、SNMP协议工作原理验证与分析

1 实验概括 实验目的&#xff1a; 学习捕获SNMP报文&#xff0c;通过报文分析理解SNMP协议的工作过程。 实验内容&#xff1a; 1&#xff09; 使用snmputilg发送SNMP数据包; 使用wireshark抓包&#xff1b;使用netstat –an查看代理站TCP/UDP连接表&#xff1b; 2&#xff09;…

单机调度问题(第i工件的完工时间=加工时间+等待时间)

第08章 制造系统的调度控制 - 百度文库 (baidu.com) 模拟退火单机极小化总流水时间的排序问题_哔哩哔哩_bilibili 在单机调度问题中&#xff0c;工件的完工时间是一个至关重要的指标&#xff0c;因为它直接反映了生产效率的高低。而完工时间的计算&#xff0c;必须同时考虑工件…

cocos creator 3.6 发布web手机端 加载进度条添加

cocos creator 升级到3.x之后加载进度条取消了&#xff0c;测试了多个3.x版本最终以creator 3.6.3版本&#xff0c;构建了简单的进度加载 参考链接&#xff1a; https://forum.cocos.org/t/topic/137113 打包web-mobile后&#xff0c;没有进度条。加载的时候只显示一个黑屏。…

贪吃蛇设计详解

在去年12月中&#xff0c;初次接触c语言&#xff0c;我靠着为数不多的知识&#xff0c;使用数组仿照写了一份贪吃蛇&#xff0c;现在时隔5个月&#xff0c;我已经有能力独立写出真正的贪吃蛇而不是简单的仿照&#xff08;虽然写的是挺简单的&#xff09;。 那么我们现在就正式…

在ComfyUI中使用Deforum简单步骤, 以及报错处理

⛳背景 deforum这个插件其实去年就在webui流行的时候火过一阵子&#xff0c;效果的话&#xff0c;因为并没有引入太多“时间”的概念&#xff0c;所以画面基本上每一帧都不一样&#xff0c;但也恰恰因为这个&#xff0c;所以可以产生很多宛若吃了毒蘑菇的视频&#xff0c;后来…

Rokid AR Lite空间计算套装发布,软硬件全面升级推动居家、出行、户外场景大规模应用

4月20日&#xff0c;以“好玩、好看、好上头”为主题的Rokid Open Day 2024发布会在杭州举行&#xff0c;Rokid对外正式发布新一代AR Lite空间计算套装&#xff0c;分享了近期Rokid在AR开发者生态和数字文化领域的进展和成果&#xff0c;并宣布了多项跨行业重磅合作。作为中国代…

OerOerlikonTCO1200欧瑞康LPCVD system操作使用说明

OerOerlikonTCO1200欧瑞康LPCVD system操作使用说明

javaWeb项目-智能仓储系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、JSP技术 JSP(Jav…

MySQL 列数据跨表拷贝,一句SQL快速将表A每条记录的某些字段拷贝到表B每条记录的某些字段(A、B表通过ID等字段对应)

文章目录 MySQL 列数据跨表拷贝&#xff0c;一句SQL快速将表A每条记录的某些字段拷贝到表B每条记录的某些字段&#xff08;A、B表通过ID等字段对应&#xff09;背景定义表填充测试数据跨表一 一对应拷贝列数据SQL参考资料 MySQL 列数据跨表拷贝&#xff0c;一句SQL快速将表A每条…

OSPF动态路由实验(思科)

华为设备参考&#xff1a;OSPF动态路由实验&#xff08;华为&#xff09; 一&#xff0c;技术简介 OSPF&#xff08;Open Shortest Path First&#xff09;是一种内部网关协议&#xff0c;主要用于在单一自治系统内决策路由。它是一种基于链路状态的路由协议&#xff0c;通过…

漆包线行业你了解多少?专业漆包线行业MES生产管理系统

今天就说说漆包线行业&#xff0c;漆包线是工业电机&#xff08;包括电动机和发电机&#xff09;、变压器、电工仪表、电力及电子元器件、电动工具、家用电器、汽车电器等用来绕制电磁线圈的主要材料。 漆包线上游是铜杆行业&#xff0c;下游是各种消费终端&#xff0c;主要是电…

详解数据在内存中的存储

系列文章目录 第一章 C语言基础知识 第二章 C语言控制语句 第三章 C语言函数详解 第四章 C语言数组详解 第五章 C语言操作符详解 第六章 C语言指针详解 第七章 C语言结构体详解 文章目录 1. 数据类型 1.1 基本数据类型 1.2 派生数据类型 2. 整形在内存中的存储 2.1 …

力扣练习题(2024/4/18)

1不相交的线 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足&#xff1a; nums1[i] nums2[j]且绘制的直线不与任何其他连线&#xff08;非水平线…

kaggle 房价预测 得分0.53492

流程 导入需要的包引入文件,查看内容数据处理调用模型准备训练输出结果 导入需要的包 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.model_selection import train_test_split from sklearn.linear_model i…

Pandas介绍与Series创建

1.Pandas介绍 Pandas 是基于 NumPy 的一种工具&#xff0c;该工具是为解决数据分析任务而创建的&#xff0c;Pandas 提供了大量能使我们快速便捷地处理数据的功能 Pandas 与出色的 Jupyter 工具包和其他库相结合&#xff0c;Python 中用于进行数据分析的环境在性能、生产率和协…