最近,我遇到了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)
因此,如果有人能在那些相当重要的 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' }
根据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
我已经做了功课,并且(几乎)找到了每个选项的作用。此外,我注意到其中的选项
/etc/security/limits.conf
比ulimit -a
. 因此,我在这里只记录了后者。当然,请大家丰富这个答案!核心文件大小 (块,-c)
创建的核心文件的最大大小。核心转储是系统快照(RAM + 上下文切换 + 处理器寄存器)。
https://en.wikipedia.org/wiki/Core_dump
数据段大小 (千字节,-d)
进程数据段的最大大小。数据段是目标文件的一部分或包含已初始化静态变量的程序的相应虚拟地址空间。
https://en.wikipedia.org/wiki/Data_segment
调度优先级 (-e)
可以给定进程的最大调度优先级(“nice”)。
https://en.wikipedia.org/wiki/Scheduling_%28computing%29
文件大小 (块,-f)
shell 及其子级写入的文件的最大大小。
未决信号 (-i)
一组等待传递给调用线程的信号。
https://unix.stackexchange.com/questions/197600/what-are-pending-signals
最大锁定内存 (千字节,-l)
可以锁定到内存中的最大大小。内存锁定确保内存始终在 RAM 中,并且永远不会移动到交换磁盘。
https://stackoverflow.com/questions/9818755/why-would-we-need-to-lock-a-processs-address-space-in-ram
最大内存大小 (千字节,-m)
进程当前在主内存 (RAM) 中拥有多少内存,而不是该进程总共拥有多少虚拟内存。
https://en.wikipedia.org/wiki/Resident_set_size
打开文件 (-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 消息队列允许进程以消息的形式交换数据。
http://linux.die.net/man/7/mq_overview
一般的消息队列https://en.wikipedia.org/wiki/Message_queue
实时优先级 (-r)
最大实时调度优先级。实时优先级线程永远不会被定时器中断抢占,并以比系统中任何其他线程更高的优先级运行。
https://stackoverflow.com/questions/1663993/what-is-the-realtime-setting-for-for-process-priority
堆栈大小 (千字节,-s)
最大堆栈大小。堆栈大小是一个保留的内存区域,用于存储函数调用的位置,以允许 return 语句返回到正确的位置。
https://en.wikipedia.org/wiki/Stack-based_memory_allocation
cpu时间 (秒,-t)
以秒为单位的最大 cpu 时间。
https://en.wikipedia.org/wiki/CPU_time
最大用户进程 (-u)
用户可以启动或派生的最大进程数。
https://en.wikipedia.org/wiki/Process_%28computing%29
此命令显示每个用户当前正在使用多少进程:
ps h -Led -o user | sort | uniq -c | sort -n
虚拟内存 (千字节,-v)
shell 可用的最大虚拟内存量。虚拟内存将程序使用的内存地址(称为虚拟地址)映射到计算机内存中的物理地址。
https://en.wikipedia.org/wiki/Virtual_memory
文件锁 (-x)
文件锁定是一种通过在任何特定时间只允许一个用户或进程访问来限制对计算机文件的访问的机制。
https://en.wikipedia.org/wiki/File_locking
由于您没有提到 Linux 限制的确切问题是什么,所以很难修复它。您
ulimit -a
用于检查您在操作系统中的所有限制。您也可以更改您拥有的每个限制(您可以减少它而不增加它,除非 root 可以做任何事情)尝试查看man ulimit
以找出您需要更改的选项。