ulimit 设置如何影响 Linux?

Buz*_*zut 7 linux ulimit

最近,我在EAGAIN一些异步代码中遇到了错误,这让我仔细查看了ulimit设置。虽然我清楚地了解某些限制,例如nofile,但其他人对我来说仍然很困惑。

很容易找到关于如何设置这些的资源,但我找不到任何文章来准确解释每个设置的内容以及它如何影响系统。

取自的定义/etc/security/limits.conf并不是不言自明:

- core - limits the core file size (KB)
- data - max data size (KB)
- fsize - maximum filesize (KB)
- memlock - max locked-in-memory address space (KB)
- nofile - max number of open files
- rss - max resident set size (KB)
- stack - max stack size (KB)
- cpu - max CPU time (MIN)
- nproc - max number of processes
- as - address space limit (KB)
- maxlogins - max number of logins for this user
- maxsyslogins - max number of logins on the system
- priority - the priority to run user process with
- locks - max number of file locks the user can hold
- sigpending - max number of pending signals
- msgqueue - max memory used by POSIX message queues (bytes)
- nice - max nice priority allowed to raise to values: [-20, 19]
- rtprio - max realtime priority
- chroot - change root to directory (Debian-specific)
Run Code Online (Sandbox Code Playgroud)

因此,如果有人能在那些相当重要的 Linux 设置上启发我,我会很高兴!

我面临的错误实际上是:

{ [Error: spawn mediainfo EAGAIN]
  code: 'EAGAIN',
  errno: 'EAGAIN',
  syscall: 'spawn mediainfo',
  path: 'mediainfo',
  spawnargs: 
   [ '--Output=XML',
     '/home/buzut/testMedia' ],
  cmd: 'mediainfo --Output=XML /home/buzut/testMedia' }
Run Code Online (Sandbox Code Playgroud)

根据gnu.org上的定义:

在选择了非阻塞模式的对象上尝试了阻塞操作。再次尝试相同的操作将阻塞,直到某些外部条件使读取、写入或连接成为可能(无论操作如何)。

我了解EAGAIN错误是指暂时不可用的资源。将所有参数设置为unlimited. 因此,我会理解哪些参数用于识别阻塞和调整——ulimit设置、我的代码或两者——的含义。

这是我目前的限制:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 127698
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 64000
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) 127698
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
Run Code Online (Sandbox Code Playgroud)

Buz*_*zut 9

我已经做了功课并且(几乎)找到了每个选项的作用。另外,我注意到,有更多的选择在/etc/security/limits.conf比它似乎有ulimit -a。因此,我在这里只记录了后者。当然,请大家丰富这个答案!


  • 数据段大小 (千字节,-d)

    进程数据段的最大大小。数据段是目标文件的一部分或包含初始化静态变量的程序的相应虚拟地址空间。

    https://en.wikipedia.org/wiki/Data_segment



  • 文件大小 (块,-f)

    shell 及其子进程写入的文件的最大大小。



  • 最大锁定内存 (千字节,-l)

    可以锁定到内存中的最大大小。内存锁定确保内存始终在 RAM 中,永远不会移动到交换磁盘。

    /sf/ask/687312881/






  • 实时优先级 (-r)

    最大实时调度优先级。实时优先级线程永远不会被定时器中断抢占,并以比系统中任何其他线程更高的优先级运行。

    /sf/ask/116479541/





  • 虚拟内存 (千字节,-v)

    Shell 可用的最大虚拟内存量。虚拟内存将程序使用的内存地址(称为虚拟地址)映射到计算机内存中的物理地址。

    https://en.wikipedia.org/wiki/Virtual_memory