最近,我有一个EAGAIN错误,一些asynchronous代码,让我仔细看看ulimit设置。 虽然我清楚地理解了某些限制,比如nofile ,其他人对我仍然感到困惑。
find关于如何设置这些设备的资源是相当容易的,但是我找不到任何文章来准确解释每个设置是什么以及如何影响系统。
取自/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上的定义:
尝试在select了非阻止模式的对象上进行操作。 再次尝试相同的操作将阻塞,直到某些外部条件使得可以读取,写入或连接(无论何种操作)。
我明白, 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
正如你没有提到在Linux中限制什么是确切的问题,所以很难解决这个问题。 你使用ulimit -a来检查你在操作系统中的所有限制。 你也可以改变你的每一个限制(你可以减less它不能增加,除了root可以做任何事情)尝试看看man ulimit找出你需要改变的选项。
我做了功课,(几乎)find了每个选项的function。 另外,我已经注意到在/etc/security/limits.conf中有更多的选项比使用ulimit -a 。 因此,我只在这里logging后者。 当然,每个人都被邀请充实这个答案!
核心文件大小 (块,-c)
创build的核心文件的最大大小。 核心转储是一个系统快照(RAM +上下文切换+处理器寄存器)。
数据段大小 (千字节,-d)
进程数据段的最大大小。 一个数据段是一个目标文件的一部分或包含初始化静态variables的程序的相应虚拟地址空间。
调度优先级 (-e)
可以给出最大调度优先级(“好”)。
文件大小 (块,-f)
shell及其子项写入的最大文件大小。
待处理信号 (-i)
待传送给调用线程的一组信号。
https://unix.stackexchange.com/questions/197600/what-are-pending-signals
最大locking内存 (千字节,-l)
可能被locking到内存的最大大小。 内存locking确保内存始终在RAM中,永不移动到交换磁盘。
最大内存大小 (千字节,-m)
主内存(RAM)中进程当前有多less内存,与进程总共有多less虚拟内存相反。
打开文件 (-n)
打开文件描述符的最大数量。 文件描述符是用于访问文件或其他input/输出资源(例如pipe道或networking套接字)的抽象指示符。
https://en.wikipedia.org/wiki/File_descriptor
列出文件描述符: http : //www.cyberciti.biz/tips/linux-procfs-file-descriptors.html
pipe道大小 (512字节,-p)
???
POSIX消息队列 (字节,-q)
POSIX消息队列中的最大字节数。 POSIX消息队列允许进程以消息的forms交换数据。
实时优先级 (-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可用的最大虚拟内存量。 虚拟内存将程序使用的内存地址(称为虚拟地址)映射到计算机内存中的物理地址中。
文件locking (-x)
文件locking是一种机制,通过在任何特定时间只允许一个用户或进程访问来限制对计算机文件的访问。