問題タブ [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.
c - setrlimit は信頼できませんか?
setrlimit()
プロセスにかかる時間を制限するために使用しようとしています。ただし、のような特定の操作を行うと機能しないようですprintf()
。
問題を説明するテスト プログラムを次に示します。
ただし、 for ループを単純なフィボナッチのような別のルーチンに置き換えると、次のようになります。
それは完全に機能します。何が起きてる?setrlimit()
単に信頼できないのですか?
c - C (OSX) でのファイル記述子の制限の変更
OSX 10.7 で実行されている C プログラムで使用できるファイル記述子の最大数を増やしたいと考えています。プロジェクトに次のコードを追加しましたが、失敗します。
これはログを出力します:
上限が少し高すぎるようです。どうしたの?
gcc - 分割スタックを使用するマルチスレッドアプリケーションでsetrlimit()を使用してスタックスペースを増やす
私は自分の仕事を盗むスケジューラーを開発することを考えています、そして解決されなければならない問題の1つはスタックオーバーフローの可能性です。これらは、1人の作業者が他の作業者から継続的にタスクを盗むというまれなケースでのみ発生します。
このパターンを回避するためにいくつかの手法を使用できますが、他の最適化が可能になるため、スタックスペースを増やすことがおそらく最良のオプションです。シングルスレッドアプリケーションでは、これはへの呼び出しで実行できますsetrlimit()
が、複数のスレッドでは効果がありません(メインスレッドから呼び出されない限り)。
この動作は、複数のスレッドにわたって固定サイズのスタックに関連している可能性があります。ただし、分割スタック(GCC 4.6.0以降で実装)では、この制限は適用されなくなりました。
私の質問は、の呼び出しがsetrlimit()
単純に分割スタックで機能するのか、それとも否定的な場合は、基になる//を呼び出して手動で実行できるのかbrk()
ということですmmap()
。sbrk()
macos - OSX / Darwin で単一プロセスのメモリ使用量を制限する
プロセスが消費できるメモリの量を制限するために、一部の JNI コードを変更しようとしています。Linux と osx で setRlimit をテストするために使用しているコードを次に示します。Linux では期待どおりに動作し、buf は null です。
このコードは、制限を 32 MB に設定してから、64 MB バッファーの割り当てを試みます。バッファーが null の場合、setrlimit は機能します。
Linuxマシンでは、これが私の結果です
OS X 10.8 の場合
私の質問は、これが osx で機能しない場合、darwin カーネルでこのタスクを実行する方法があるかということです。マニュアルページはすべて動作すると言っているようですが、動作しないようです。launchctl がメモリ制限をサポートしていることを見てきましたが、私の目標はこの機能をコードに追加することです。ulimit も使用してみましたが、これも機能せず、ulimit が setrlimit を使用して制限を設定していることは確かです。また、setrlimit のソフトまたはハードリミットを超えたときにキャッチできるシグナルはありますか。私はそれを見つけることができませんでした。
Windowsでも実行できる場合のボーナスポイント。
アドバイスをありがとう
更新
指摘したように、RLIMIT_AS はマニュアル ページで明示的に定義されていますが、RLIMIT_RSS として定義されているため、ドキュメントを参照すると、RLIMIT_RSS と RLIMIT_AS は OSX 上で交換可能です。
/usr/include/sys/resource.h osx 10.8 の場合
ここで説明されているRLIMIT_DATAを使用するというtrojanfoeの優れた提案をテストしました
結果は linux と osx で同じで、どちらも malloc が成功しました。
unix - 子プロセスで開いているファイル記述子を閉じる
すでに開いているファイル記述子 (親プロセスによって開かれている) を繰り返し処理し、子プロセスでそれらを 1 つずつ閉じる方法はありますか?
OS: ユニックス。
終了の理由: setrlimit() の RLIMIT_NOFILE 制限により、プロセスが割り当てることができるファイル記述子の数が制限されます。この制限を設定して子プロセスを制限する場合は、既に割り当てられているファイル記述子に依存します。
親プロセスにはいくつかの開いているファイル記述子があるため、子プロセスでこの制限を設定しようとすることは制限されているため、この制限をその数より小さく設定することはできません。
例: 親プロセスに 10 個のファイル記述子が割り当てられており、子プロセスのファイル記述子の数を 10 未満に制限したい場合 (Say 3)、子プロセス内の 7 個のファイル記述子を閉じる必要があります。
これに対する解決策は、子プロセスが新しいファイルを作成したり、新しいネットワーク接続を開いたりすることを制限したいすべての人に役立ちます。
python - MacOS上のPythonはrlimitを完全に無視します
MacOSでの私のPythonプロセスは、それ以下に設定したrlimitを完全に無視しています。(設定されていることを印刷で確認しました)
物理メモリ使用量が2.4Gbを超えると、CPU使用率が<< 5%低下し、ハングします。(根本的な原因は配列の割り当てが多すぎるようですが、OutOfMemory
例外を強制してどこを特定することはできないので、行き詰まっています)。どうしたの?ハードrlimitsは無視できないと思いましたか?
編集:問題のある割り当てはネイティブPythonではなく、numpyまたはscikit-learnのいずれかで行われていることに気付きました。cpython:Modules / resource.cのソースへのリンクもしそうなら、それは間違いなくdocbugでしょう。
バージョン:MacOS 10.8.2のpython2.7.3(macports、64b)、py27-numpy。
マシンには4Gbの物理RAMがあります。
c - Linux で fd < 開いているファイル記述子の最大数を期待するのは合理的ですか?
私は多くの開いているソケットを処理する必要があるサーバーを書いているので、次のようにsetrlimit()
開いているファイル記述子の最大数を (ルートとして、権限を削除する前に) 設定するために使用します。
今では、おそらく何の保証もないこと、そして Linux カーネルがファイル記述子テーブルを実装するために使用する方法に翻弄されていることを理解しています。しかし実際には、このプログラムが Linux カーネルから受け取る fd の値が、上で設定した MAX_FD_C よりも小さいと仮定するのは妥当でしょうか?
ソケットごとのデータをできるだけコンパクトに保ちたいと思います。これは、単純に配列のようなものstatic struct client clients[MAX_FD_C] = {{0}};
を使用し、fd をクライアント構造体へのインデックスとして使用することを意味します (基本的には、FDT の独自のバージョンになります)。
linux - Linux でプログラムのメモリ使用量を制限する
私は Linux とターミナル (またはそれが使用するコマンド プロンプトの種類) に不慣れで、プロセスが使用できる RAM の量を制御したいと考えています。使いやすいガイドを見つけるために、すでに何時間も探しました。それを制限するためのいくつかの要件があります。
- プログラムの複数のインスタンスが実行されますが、一部のインスタンスのみを制限したいと考えています。
- 制限を超えたときにプロセスがクラッシュすることは望ましくありません。HDDページスワップを使用したい。
- プログラムは WINE で実行され、.exe です。
では、Linux のプロセスで RAM の使用を制限するコマンドを教えてください。