問題タブ [setrlimit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 匿名の mmap とデータ セグメントのサイズ
Unix システムに匿名の mmap が導入されて以来、mmap アドレス空間がデータ セグメント サイズに含まれていないため、RLIMIT_DATA は役に立たないという印象を受けました。特に、glibc の malloc() 実装は、大規模な割り当てに匿名の mmap を使用します。
ただし、私のテストでは、少なくとも少し古い Linux システムでは、匿名の mmap がデータ セグメントに含まれていることがわかりました。以下のテストプログラムを検討してください。
RHEL5、6、および Ubuntu 12.04 でテスト済み。これらすべてで、anonymous mmap() (MODE=0、glibc malloc() を使用する場合は MODE=2) を使用して割り当てると、データ セクションのサイズ (VmData) が割り当てを含めるために増加します。
EDIT : いくつかのさらなる実験では、匿名の mmap() は /proc/[PID]/status の VmData フィールドで報告されるデータ セクションのサイズを増加させますが、RLIMIT_DATA 制限はヒープ サイズ、つまり brk() にのみ適用されることを示しています。割り当てであり、匿名の mmap() ではありません。ああ!
さて、私の質問は、これが Linux での動作であった期間と、他の Unix システムへの移植性はどの程度かということです。つまり、他の Unix でもデータ セグメント サイズに匿名の mmap が含まれていますか?
linux - Apache 2.4 が rlimit_nproc にヒット: 隠しプロセス?
私の Web アプリケーションでは、ユーザーがサンドボックスで任意のコードを実行できます。forkbomb を防ぐために、アプリケーションはsetrlimitRLIMIT_NPROC
を呼び出し、ユーザー コードを実行する前に 50 に制限します。これは、Ubuntu 12.04 から Ubuntu 13.04 までうまく機能しました。しかし、Ubuntu 13.10 (Apache 2.4 および Linux 3.11 に同梱) にアップグレードした後、www-data
Apache2 がアイドル状態の場合でも、50 プロセスの制限に達しました!
この問題は、 を使用しbash
てユーザーとして実行することにより、最も簡単に再現できます。最初にユーザーに切り替えて開始します:www-data
ulimit
www-data
bash
RLIMIT_NPROC
問題が発生するまで徐々に下げます。
したがって、RLIMIT_NPROC
50 に設定すると、プロセスはフォークできなくなります。これは、すでに 50 以上のプロセスが user として実行されていることを意味しますwww-data
。ただし、これは当てはまらないようです。サーバーは空のアイドル状態の Apache 2.4 です。によるとps
、現在 が所有する proc は 2 つだけwww-data
です。
では、アイドル状態であっても Apache 2.4 で 50www-data
の制限に達するのはなぜですか?RLIMIT_NPROC
python - Python のリソース RLIMIT_FSIZE 設定で使用される単位
docsによると、 Pythonを使用すると、ファイルサイズの制限を次のように設定できます。
しかし、ここにあるユニットが何であるかは明らかではありません。
Bash ビルトインulimit
は、すべてにキロバイトを使用します。
c - RLIMIT_NPROC 値を編集するより良い方法
私のアプリケーションは接続スレッドごとに作成します。ゼロ以外のユーザー ID でアプリケーションが破壊され、スレッド数がデフォルト値の 1024 を超えることがあります。この番号を編集したいので、選択肢がほとんどありません
ルートとして実行 [非常に悪い考えであり、セキュリティについても妥協する必要があるため、削除する]
特権のないユーザーの下で実行するにはsetcapを使用し、機能CAP_SYS_RESOURCEを付与します。次に、プログラムにコードを追加できます
他には/etc/securitylimits.confを編集することです 。ここで、開発ユーザーのエントリを作成して、たとえば行を入れることができます
ここで、10k で十分です。したがって、ソース コードを変更することに少し気が進まないので、最後のオプションに進む必要があります。そして、私はより堅牢で標準的なアプローチが何であるかを知りたいと思っています。
ご意見をお待ちしております。よろしくお願いします:)
PS: 1 つのプロセスが 1,000 を超えるスレッドで処理される場合はどうなりますか。もちろん、私は32GBのRAMも持っています
c++ - 生成された std::threads に setrlimit() が影響しない
現在、複数の画像を一度に読み込んで変換するパイプラインに取り組んでいます。これは同時に多くの画像 (1440) で発生しているため、メモリ フットプリントが非常に大きくなります。そのため、setrlimit に基づいてメモリ管理システムを実装しようとしましたが、生成されたスレッド (std::thread) は喜んで制限を無視するため、影響はないようです。スレッド化された関数 - 最終的にプログラムが強制終了されます。制限を設定するために使用するコードは次のとおりです。
私はLinuxを使用しています。man ページには、 setrlimit がプロセス全体に影響を与えると記載されているため、スレッドが影響を受けないように見える理由がわかりません。
編集:ちなみに、上記の関数は main() の最初で呼び出されます。
memory - POSIX rlimit: RLIMIT_DATA について正確に何を想定できますか?
前提条件
POSIX.1 2008 はおよび関数を指定します。引数にはさまざまな定数が用意されていますが、私の質問を理解しやすくするために、そのうちのいくつかを以下に再掲します。setrlimit()
getrlimit()
resource
次のリソースが定義されています。
(...)
RLIMIT_DATA
これは、プロセスのデータ セグメントの最大サイズ (バイト単位) です。この制限を超えると、malloc() 関数は失敗し、errno が [ENOMEM] に設定されます。
(...)
RLIMIT_STACK
これは、初期スレッドのスタックの最大サイズ (バイト単位) です。実装によって、この制限を超えてスタックが自動的に拡張されることはありません。この制限を超えると、スレッドに対して SIGSEGV が生成されます。スレッドが SIGSEGV をブロックしている場合、またはプロセスが SIGSEGV を無視またはキャッチしており、代替スタックを使用する準備をしていない場合、SIGSEGV の処理は、生成される前に SIG_DFL に設定されます。
RLIMIT_AS
これは、プロセスで使用可能な合計メモリの最大サイズ (バイト単位) です。この制限を超えると、malloc() および mmap() 関数は失敗し、errno が [ENOMEM] に設定されます。さらに、自動スタック拡張は上記の影響で失敗します。
さらに、POSIX.1 2008では、 データ セグメントを次のように定義しています。
3.125 データセグメント
動的に割り当てられたデータを格納できる、プロセスに関連付けられたメモリ。
RLMIT_DATA
リソースは従来、関数を使用してプロセスに割り当てることができるメモリの最大量を示すために使用されていたことを理解していbrk()
ます。POSIX.1 の最近の版では、この関数を指定しなくなりました。また、多くのオペレーティング システム (Mac OS X など) は、この関数をシステム コールとしてサポートしていません。代わりにmmap()
、POSIX.1 2008 の一部ではないバリアントでエミュレートされます。
質問
リソースのセマンティックと使用について少し混乱していRLIMIT_DATA
ます。ここに私が持っている具体的な質問があります:
この仕様に従って、スタックをデータセグメントの一部にすることはできますか?
標準では、
RLIMIT_DATA
「この制限を超えると、malloc() 関数は失敗し、errno が [ENOMEM] に設定されます。」これは、割り当てられたメモリmalloc()
がデータ セグメントの一部でなければならないということですか?Linux では、割り当てられたメモリ
mmap()
はデータ セグメントにカウントされません。brk()
またはに割り当てられたメモリのみsbrk()
がデータ セグメントの一部です。最近のバージョンの glibc では、malloc()
すべてのメモリを .xml で割り当てる実装が使用されていmmap()
ます。したがって、 の値はRLIMIT_DATA
、 のこの実装で割り当てることができるメモリの量には影響しませんmalloc()
。これは POSIX.1 2008 に違反していますか?
他のプラットフォームは同様の動作を示しますか?
標準は次のように述べてい
RLIMIT_AS
ます。の障害は にmmap()
指定されていないため、 から取得したメモリはデータ セグメントにはカウントされないRLIMIT_DATA
と結論付けます。mmap()
この仮定は正しいですか?これは の非 POSIX バリアントにのみ適用されます
mmap()
か?
android - RLIMIT_NPROC の正しい定義は何ですか?
Android エクスプロイトRage Against The Cage の実装を調べています。その背後にある考え方は、次に Android Debug Bridge (ADB) デーモンがその権限をrootからshellにドロップしようとしたときに、への呼び出しが失敗して実行を継続できるようRLIMIT_NPROC
に、シェルUIDに到達するために必要な数のプロセスを作成することです。 rootとして(このバグは、続行する前に呼び出しの結果を確認することで修正されています)。setuid()
setuid()
setrlimit()
ドキュメントによると、RLIMIT_NPROC
次のように定義されています。
呼び出しプロセスの実ユーザー ID に対して作成 できるプロセス (より正確には、Linux ではスレッド) の最大数[強調] 。この制限に達すると、fork(2) はエラー EAGAIN で失敗します。この制限は、CAP_SYS_ADMIN または CAP_SYS_RESOURCE 機能を持つプロセスには適用されません。
さらに、エクスプロイトは次のように実装されました。
したがって、RLIMIT_NPROC
「作成できるプロセスの最大数」として定義されます — 「同時に実行する」ではなく、作成されます — 実装は、2 番目のフォークによって作成されたすべての子プロセスを終了することによって定義されます。
まず第一に、UID ごとに作成されるプロセスの数を制限することがどのように機能するのか理解できません (そのカウントをリセットするには、時々マシンを再起動する必要がありますよね?)。第二に、エクスプロイトをリバース エンジニアリングし、上記のものと同等の実装を取得した人物でさえ、RLIMIT_NPROC
異なる定義をしています。
[エクスプロイト]は、特定の UID で実行できるプロセスの数を定義する値である RLIMIT_NPROC max を利用します。
とはいえ、RLIMIT_NPROC は実際にどのように機能するのでしょうか? どちらの定義がより正確ですか?
c - cのsetrlimitでミリ秒の精度を持つことは可能ですか
タイトルが示唆するように、 setrlimit RLIMIT_CPUで 2 秒未満の精度にする方法があるかどうかを知る必要がありますか?
(典型的なシステムでは、プログラムは一度に最大10ミリ秒かかる場合があることを知っています)ミリ秒の精度である必要さえありません。100msで十分です。
だから私はそれが次のようなものであることに興味があります:
これが必要な理由と使用方法を説明することの関連性がわかりません。必要に応じて、質問と情報を編集します。
前もって感謝します、
元
c - setrlimit を使用してスレッドのスタック サイズを設定する
デフォルトのスタック サイズ 8MB を使用して pthread を作成するライブラリを使用しています。ライブラリが作成するスレッドのスタック サイズをプログラムで減らすことは可能ですか? setrlimit(RLIMIT_STACK...)
関数内で使用してみmain()
ましたが、効果がないようです。 ulimit -s
仕事をしているようですが、プログラムが実行される前にスタックサイズを設定したくありません。
私にできることはありますか?ありがとう
更新 1:setrlimit(RLIMIT_STACK,...).
常駐メモリを確認したところ、仮想メモリよりもはるかに小さいことがわかりました。これは、私がスタック サイズを制限しようとするのをあきらめるのに十分な理由です。