最近,我在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)
我已经做了功课并且(几乎)找到了每个选项的作用。另外,我注意到,有更多的选择在/etc/security/limits.conf
比它似乎有ulimit -a
。因此,我在这里只记录了后者。当然,请大家丰富这个答案!
核心文件大小 (块,-c)
创建的核心文件的最大大小。核心转储是系统快照(RAM + 上下文切换 + 处理器寄存器)。
数据段大小 (千字节,-d)
进程数据段的最大大小。数据段是目标文件的一部分或包含初始化静态变量的程序的相应虚拟地址空间。
调度优先级 (-e)
可以给出进程的最大调度优先级(“nice”)。
文件大小 (块,-f)
shell 及其子进程写入的文件的最大大小。
待处理信号 (-i)
等待传递给调用线程的一组信号。
https://unix.stackexchange.com/questions/197600/what-are-pending-signals
最大锁定内存 (千字节,-l)
可以锁定到内存中的最大大小。内存锁定确保内存始终在 RAM 中,永远不会移动到交换磁盘。
最大内存大小 (千字节,-m)
一个进程当前在主内存 (RAM) 中拥有多少内存,而不是该进程总共拥有多少虚拟内存。
打开文件 (-n)
打开的文件描述符的最大数量。文件描述符是用于访问文件或其他输入/输出资源(例如管道或网络套接字)的抽象指示符。
https://en.wikipedia.org/wiki/File_descriptor
列出文件描述符:http : //www.cyberciti.biz/tips/linux-procfs-file-descriptors.html
管道大小 (512 字节,-p)
管道的内部缓冲区大小。请参阅http://man7.org/linux/man-pages/man7/pipe.7.html 中的“管道容量”部分
POSIX 消息队列 (字节,-q)
POSIX 消息队列中的最大字节数。POSIX 消息队列允许进程以消息的形式交换数据。
实时优先级 (-r)
最大实时调度优先级。实时优先级线程永远不会被定时器中断抢占,并以比系统中任何其他线程更高的优先级运行。
堆栈大小 (千字节,-s)
最大堆栈大小。堆栈大小是保留的内存区域,用于存储函数调用的位置,以便让 return 语句返回到正确的位置。
cpu 时间 (秒,-t)
以秒为单位的最大 CPU 时间。
最大用户进程数 (-u)
用户可以启动或分叉的最大进程数。
https://en.wikipedia.org/wiki/Process_%28computing%29
此命令显示每个用户当前使用的进程数:
ps h -Led -o user | sort | uniq -c | sort -n
虚拟内存 (千字节,-v)
Shell 可用的最大虚拟内存量。虚拟内存将程序使用的内存地址(称为虚拟地址)映射到计算机内存中的物理地址。
文件锁 (-x)
文件锁定是一种机制,它通过在任何特定时间只允许一个用户或进程访问来限制对计算机文件的访问。