一般的なLinuxディストリビューションでは、、、、rm
などmv
のユーティリティはその引数と並列に実行されますか?ls
grep
wc
つまり、grep
32スレッドCPUで大容量ファイルを処理すると、デュアルコアCPUよりも高速に実行されますか?
ベストアンサー1
ユーティリティがライブラリに関連付けられていることを確認すると、最初の印象を知ることができますpthread
。オペレーティングシステムスレッドを使用する動的にリンクされたプログラムはpthreadライブラリを使用する必要があります。
ldd /bin/grep | grep -F libpthread.so
Ubuntuを例に挙げてみましょう。
for x in $(dpkg -L coreutils grep findutils util-linux | grep /bin/); do if ldd $x | grep -q -F libpthread.so; then echo $x; fi; done
ただし、プログラム自体がpthreadに関連付けられているライブラリに関連付けられているため、多数の誤検出が発生します。たとえば、/bin/mkdir
私のシステムでは、それ自体がpthreadに関連付けられているPCRE(理由はわかりません...)に関連付けられています。しかし、mkdir
どのような方法で並列化されていない。
実際には、実行可能ファイルが含まれていることを確認すると、libpthread
より信頼できる結果が得られます。並列動作がライブラリに完全に含まれている実行可能ファイルが欠落している可能性がありますが、デフォルトのユーティリティは通常そのように設計されていません。
dpkg -L coreutils grep findutils util-linux | grep /bin/ | xargs grep pthread
Binary file /usr/bin/timeout matches
Binary file /usr/bin/sort matches
したがって、実際に並列化できる唯一のツールはですsort
。 (timeout
librtに接続されているのでlibpthreadにのみ接続されます。)GNUはsort
並列に動作します。スレッド数は次のように構成できます。--parallel
オプションデフォルトでは、プロセッサごとに1つのスレッドを使用して最大8つまで可能です。 (プロセッサーの数が増えると、より多くのプロセッサーを使用する利点が減ります。、徐々に減少速度は、タスクの並列化の程度に依存します。 )
grep
並列化はまったくありません。 PCREライブラリは、ロックを使用するスレッドから安全な機能を提供し、ロック操作機能がpthreadライブラリにあるため、実際にpthreadライブラリにリンクされます。
大量のデータを処理するときに一般的に並列化の利点を享受する簡単な方法は、データを複数の部分に分割し、その部分を並列に処理することです。 grepの場合は、ファイルサイズを制御可能に保ち(たとえば、ログファイルの場合は十分に頻繁に回転)、各ファイルで別々のgrepインスタンスを呼び出します(たとえば、次のように)GNUパラレル)。 greppingは通常IOバウンド(または非常に複雑な正規表現がある場合、またはGNU grep(パフォーマンスの低下)の一部のUnicodeコーナーケースが発生した場合はCPUバウンド)なので、スレッド数が多いと多くの利点を得る可能性はありません。