最近,我遇到了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网站:
尝试对已选择非阻塞模式的对象执行会阻塞的操作。再次尝试同一操作将阻塞,直到某些外部条件使其能够读取、写入或连接(无论操作是什么)。
我理解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
答案1
我已经做了功课,(几乎)找到了每个选项的作用。另外,我注意到 中的选项/etc/security/limits.conf
比 中显示的要多ulimit -a
。因此,我在这里只记录了后者。当然,欢迎大家来丰富这个答案!
核心文件大小 (块,-c)
创建的核心文件的最大大小。核心转储是系统快照(RAM + 上下文切换 + 处理器寄存器)。
数据段大小 (千字节,-d)
进程数据段的最大大小。数据段是目标文件的一部分或包含已初始化静态变量的程序的相应虚拟地址空间。
调度优先级 (-e)
可以赋予进程的最大调度优先级(“nice”)。
文件大小 (块,-f)
shell 及其子进程写入的文件的最大大小。
待处理信号 (-我)
等待传送给调用线程的一组信号。
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)
最大实时调度优先级。实时优先级线程永远不会被定时器中断抢占,并且比系统中任何其他线程的运行优先级都高。
https://stackoverflow.com/questions/1663993/what-is-the-realtime-setting-for-for-process-priority
堆栈大小 (千字节,-s)
最大堆栈大小。堆栈大小是内存的保留区域,用于存储函数调用的位置,以便允许返回语句返回到正确的位置。
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)
文件锁定是一种限制对计算机文件的访问的机制,通过在任何特定时间只允许一个用户或进程访问。
答案2
由于您没有提到 Linux 中限制的具体问题,因此很难修复它。您可以使用ulimit -a
for 检查操作系统中的所有限制。您还可以更改每个限制(您可以减少它,但不能增加,但 root 可以执行任何操作)尝试查看man ulimit
以找出您需要更改哪个选项。