
sort
メモリの過剰使用により強制終了されるという問題が発生していますが、なぜ指定された制限を大幅に超過するのか理解できません。
Context:
Available physical RAM: 8GB
Memory in use by system: <500MB (FreeBSD 13)
Free memory: ~7.5GB
Swap: 2G
No system hard limit on mem usage ($ ulimit -> unlimited)
File being sorted: 300+ GB
HDD space: 1Tb+ free both on target or temporary dir.
使用可能なリソース制限を指定して sort を実行した場合でも、明示的な引数を指定せずに (使用可能なリソースの 90% に自動的に設定されるはず)、最終的には使用量超過のために強制終了されます。
[mario@casa-server ~/pjy]$ sort -S 7G -T /filesWD-WMAY03648941/tmp/ -o /filesWD-WMAY03648941/pjA-sorted.txt pjyA.txt
Killed
[mario@casa-server ~/pjy]$
[mario@casa-server ~/pjy]$ sort -T /filesWD-WMAY03648941/tmp/ -o /filesWD-WMAY03648941/pjA-sorted.txt pjyA.txt
Killed
[mario@casa-server ~/pjy]$
どうやら、リソース制限の使用量を実際に超えているようです。-S 3G で実行すると、時々 5G 程度の使用量が見られます。
# ~5G USAGE EVEN WITH EXPLICIT -S 3G LIMIT
[mario@casa-server ~]$ sudo procstat -r 3183
PID COMM RESOURCE VALUE
3183 sort user time 00:27:51.849171
3183 sort system time 00:03:28.220262
3183 sort maximum RSS 5423072 KB
3183 sort integral shared memory 10505728 KB
3183 sort integral unshared data 1910064 KB
3183 sort integral unshared stack 30560128 KB
3183 sort page reclaims 8172561
3183 sort page faults 1724
3183 sort swaps 0
3183 sort block reads 24296
3183 sort block writes 17719
3183 sort messages sent 0
3183 sort messages received 0
3183 sort signals received 0
3183 sort voluntary context switches 5868
3183 sort involuntary context switches 30700
[mario@casa-server ~]$
# TOP excerpt
PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND
3183 mario 1 103 0 4657M 4603M CPU3 3 38:23 99.88% sort -S 3G -T /filesWD-WMAY03648941/tmp/ -o /files
# NO SO LIMIT ON USAGE
[mario@casa-server ~]$ sudo procstat -l 3183
PID COMM RLIMIT SOFT HARD
3183 sort cputime infinity infinity
3183 sort filesize infinity infinity
3183 sort datasize 32768 MB 32768 MB
3183 sort stacksize 524288 KB 524288 KB
3183 sort coredumpsize infinity infinity
3183 sort memoryuse infinity infinity
3183 sort memorylocked 65536 B 65536 B
3183 sort maxprocesses 12186 12186
3183 sort openfiles 234576 234576
3183 sort sbsize infinity infinity
3183 sort vmemoryuse infinity infinity
3183 sort pseudo-terminals infinity infinity
3183 sort swapuse infinity infinity
3183 sort kqueues infinity infinity
3183 sort umtxp infinity infinity
[mario@casa-server ~]$
[mario@casa-server ~]$ ulimit
unlimited
これは、7G の制限 (使用可能な 7.5 のうち) で実行されたとき、または制限が自動的に設定されたときに強制終了される理由を説明しています。すべてのメモリとスワップの使用量が実際に超過していたためです (そして予想どおり OS によって強制終了されました)。
しかし、ここで何が欠けているのでしょうか? man sort
:
-S size, --buffer-size=size
Use size for the maximum size of the memory buffer. Size
modifiers %,b,K,M,G,T,P,E,Z,Y can be used. If a memory limit is
not explicitly specified, sort takes up to about 90% of available
memory. If the file size is too big to fit into the memory
buffer, the temporary disk files are used to perform the sorting.
設定されている場合-S 3G
、HDD の一時フォルダーではなく RAM が使用されるのはなぜですか?
PS: 他の「メモリ不足によりソートが強制終了される」ことに関連する質問をしようとしましたが、一部のモデレーターによって管理が不適切でした。これは関連する質問だと思います (関連のない質問としてフラグを付けると、解決策が断片化されるだけです)。また、他の多くの解決策を読みましたが、このケースには適していません。
皆さんありがとう