Имеется сервер:
4 ядра Intel(R) Xeon(R) CPU E5-1410 v2 @ 2.80GHz (8 потоков), 64 Гб памяти, SSD
Конструкция
text
cat very_big_file|fgrep -x -f big_file > rez_file
съедает всю память и выдает примерно "Cannot allocate memory" при этом все остальные запущенные на сервере процессы тоже обрываются по подобной ошибке и сервер уходит в офлайн - приходится перезагружать.
Кто подскажет с чем это связано?
Файлы порядка 8 Гб, памяти аж 64 Гб да и насколько я знаю это конструкция спокойно отрабатывается на любых компьютерах и даже с намного меньшей памятью.
Что не так? Куда копать, что именно пожирает память и как перенастроить?
ну как бы вопрос не в этом, я понимаю что конструкция не совсем верная, но тем не менее она должна нормально работать и прекрасно работает на всех серверах (у меня 4 подопытных машины), а на этой причем на самой мощной она почему-то пожирает всю память - вот собственно почему...
ну как бы вопрос не в этом, я понимаю что конструкция не совсем верная, но тем не менее она должна нормально работать и прекрасно работает на всех серверах (у меня 4 подопытных машины), а на этой причем на самой мощной она почему-то пожирает всю память - вот собственно почему...
$ grep --version
grep (GNU grep) 2.12
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
Не очень понял, те тележки слабее чем эта и там работает, я 100500 раз испытывал подобную конструкцию - всегда все работало, впервые столкнулся с тем что это может сожрать память - ведь это по определению нелогично, система в любом случае должна быть достаточно умна чтобы подобного не случилось, тем более что файлы оба даже целеком влезут в ОП которой 64 Гб, так как они порядком 8 ГБ каждый.
якобы? мне кажется оно должно работать даже если файлы по 100500 гиг, разве меня должно интересовать что куда оно копирует - ОП или диск - мне надо получить результат, никогда не встречал чтобы такое сожрало память - это очень похоже на какой-то баг...
это по определению нелогично, система в любом случае должна быть достаточно умна чтобы подобного не случилось
прям будто вчера первый раз линь поставил... если ты сказал системе прострелить тебе в ногу ни кто тебя от этого отговаривать не будет...
"valet" написал:
тем более что файлы оба даже целеком влезут в ОП которой 64 Гб, так как они порядком 8 ГБ каждый.
размер и влезет ли в память первый (very_big_file) значения не имеет... если бы просто grep жрал бы в разы больше, чем нужно — ответ то же был бы простой: оно так устроено...
а вот почему fgrep жрёт столько памяти уже действительно заставляет задуматься... даже если бы он жрал в 2-4 раза больше размера файла, то это можно было бы списать на внутреннее устройство... по моим экспериментам, сейчас выходит, что он требует в 5—20 раз больше ОП... так что возможно действительно:
"valet" написал:
это очень похоже на какой-то баг
"valet" написал:
я 100500 раз испытывал подобную конструкцию - всегда все работало
если ты сказал системе прострелить тебе в ногу ни кто тебя от этого отговаривать не будет...
не соглашусь, я использую более чем стандартные утилиты, с чего бы они должны сжирать память, они сами должны знать как правильно отработать, есть память - хорошо, исопльзуй, пожалуйста, но не до отказа же сервера, пиши своп, диск, куда угодно - я же не просил мне положить сервер (прострелить ногу) разве не так?
Поставил это же на другом сервере, пока отрабатывает, о результатах отпишу...
Но уже вижу что будет все нормально, так как юзается 1 ядро, и 11,4% память - вижу по htop
valet@valet-comp:~$ du -h very_big_file
7.3G very_big_file
valet@valet-comp:~$ du -h big_file
64M big_file
valet@valet-comp:~$ time cat very_big_file |fgrep -x -f big_file > rez_file
real 12m57.766s
user 12m53.496s
sys 0m4.908s
valet@valet-comp:~$
Вот идеально отработало без каких либо проблем.
Чего и следовало ожидать, я же говорю - исопльзую подобные конструкции 100500 раз, никогда не замечал чтобы они сжирали память
valet@valet-comp:~$ du -h very_big_file
7.3G very_big_file
valet@valet-comp:~$ du -h big_file
64M big_file
Ну это естественно, файлы называются вообще по-другому, я для понимания в первом посте указал такие имена чтобы было понятно что это какие-то крупные текстовые файлы, а на рабочем сервере уже и переименовал их соотвественно на big_file и very_big_file.
"Fat-Zer" написал:
и какое использоване памяти?
та никакое - там по htop этот процесс жрал 11.4% памяти, нагрузки вообще и не было (по load average), только на одно ядро 100% и все и отработало как видим за 12 минут.
"Fat-Zer" написал:
с big_file в несколько сотен мб всё равно работает?
работает в точности как я скопировал - я ж специально даже время засек - это реальная копия с консоли на этот раз с рассматриваемыми именами файлов.
То есть как я понимаю отрабатывает и то быстро, но память не показыва
valgrind не установлен?
и не забудь потом foo и bar снести...
"valet" написал:
та никакое - там по htop этот процесс жрал 11.4% памяти, нагрузки вообще и не было (по load average), только на одно ядро 100% и все и отработало как видим за 12 минут.
я прогуливал занятия телепатии в начальной школе и мне 11.4% ни о чём не говорит, но из того, что я нахватался рискну предположить, что это от 16-ти гигов... если так, то вполне уклаывается в результат, хотя для такой задачи это невероятно большой расход памяти... но grep так устроен...
"valet" написал:
Ну это естественно, файлы называются вообще по-другому, я для понимания в первом посте указал такие имена чтобы было понятно что это какие-то крупные текстовые файлы, а на рабочем сервере уже и переименовал их соотвественно на big_file и very_big_file.
так... чтобы расставить точки над и:
text
very_big_file: 7.3G
big_file: 64M
и точно так было когда боевая тачка навернулось от нехватки памяти, так? very_big и big точно местами не перепутал когда запускал?
ещё есть подозрение, что grep начинает непомерно кушать память когда в big_file есть повреждённая многобайтовая кодировка... сможешь удостовериться, что это не так?