最近、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
に設定するのは賢明ではありません。したがって、どのパラメーターが1つのブロックを識別して調整するか(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 +コンテキストスイッチ+プロセッサレジスタ)です。
data seg size(kbytes、-d)
プロセスのデータセグメントの最大サイズ。データセグメントは、オブジェクトファイルの一部、または初期化された静的変数を含むプログラムの対応する仮想アドレス空間です。
スケジューリング優先度(-e)
プロセスに最大のスケジューリング優先順位(「ニース」)を与えることができます。
ファイルサイズ(ブロック、-f)
シェルとその子によって書き込まれるファイルの最大サイズ。
保留中のシグナル(-i)
呼び出しスレッドへの配信が保留されているシグナルのセット。
https://unix.stackexchange.com/questions/197600/what-are-pending-signals
max locked memory(kbytes、-l)
メモリにロックできる最大サイズ。メモリロックにより、メモリは常にRAM=にあり、スワップディスクに移動されることはありません。
最大メモリサイズ(kbytes、-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メッセージキューを使用すると、プロセスはメッセージの形式でデータを交換できます。
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ステートメントが正しい場所に戻ることができるように、関数呼び出しの場所を格納するために使用される予約済みのメモリ領域です。
CPU時間(秒、-t)
秒単位のCPU時間の最大量。
最大ユーザープロセス(-u)
ユーザーが開始またはフォークできるプロセスの最大数。
https://en.wikipedia.org/wiki/Process_%28computing%29
このコマンドは、各ユーザーが現在使用しているプロセスの量を示します。
ps h -Led -o user | sort | uniq -c | sort -n
仮想メモリ(kbytes、-v)
シェルで使用可能な仮想メモリの最大量。仮想メモリは、プログラムが使用するメモリアドレス(仮想アドレスと呼ばれます)をコンピュータメモリの物理アドレスにマップします。
ファイルロック(-x)
ファイルロックは、特定の時間に1人のユーザーまたはプロセスのみにアクセスを許可することにより、コンピューターファイルへのアクセスを制限するメカニズムです。
Linuxでの制限の正確な問題は何も触れていないので、修正するのは難しいでしょう。あなたが使う ulimit -a
OSでのすべての制限を確認してください。また、すべての制限を変更することもできます(rootが何でもできる場合を除いて、増やすことはせずに減らすこともできます)man ulimit
変更する必要があるオプションを確認します。