
과도한 메모리 사용으로 인해 종료되는 문제에 직면해 있는데 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.
사용 가능한 리소스 제한을 지정하여 정렬을 실행하는 경우에도 마찬가지입니다. 또는 명시적인 인수(사용 가능한 값의 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 사용 가능)으로 실행하거나 제한이 자동으로 설정된 경우 종료되는 이유를 설명합니다. 실제로 모든 mem+swap 사용이 초과되었습니다(예상대로 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 사용이 종료되는 이유는 무엇입니까?
추신: 다른 '메모리 부족으로 인해 종료되는 정렬'과 관련된 질문을 하려고 했지만 일부 중재자가 잘못 관리했습니다. 나는 그것이 관련된 질문이라고 생각합니다(관련되지 않은 질문으로 표시하면 솔루션이 조각화될 뿐입니다). 또한 다른 가능한 솔루션을 많이 읽었지만 이 경우에는 적합하지 않습니다.
모두 감사합니다