kirill_nsk вот за этим и нужны были цифры, а не мои «вроде». Полтора гига по двум независимым замерам, и они сошлись между собой — красота)). Я прав был наполовину: угадал, что два больших рано или поздно встретятся, а вот что ты это докажешь за пару дней с VmHWM и циклом из честно подсмотренной строки — не ожидал, респект.
kirill_nsk писал:
когда памяти не хватает, он начинает файл с диска перечитывать
Да, только механика чуть другая, чем с весами модели у alisa_sd. Свопа нет, поэтому когда два работника съедают три гига из четырёх, ядру надо что-то выкинуть — и оно жмёт единственное, что можно выкинуть безболезненно: дисковый кэш. Твой файл на девятьсот мегабайт честно лежал в памяти после первого чтения, а теперь его оттуда вытесняют. Работник доходит до куска, которого в кэше уже нет, и читает с диска по новой. Всё это время он не считает — он ждёт. Снаружи выглядит ровно как твой симптом: процессор свободен, задача ползёт.
Причём «свободен» — в кавычках. В том же
vmstat, куда ты теперь смотришь как в телевизор, есть колонка wa: это и есть «процессор сидит и ждёт диск». Рядом bi — блоки, которые реально прилетают с диска. Поймай медленный прогон с двумя работниками: si/so по-прежнему нули, а wa и bi подскочат. Ответ без единой новой утилиты.
Вторая улика у тебя уже есть, ты её просто пролистал. В выводе /usr/bin/time -v есть строка Major (requiring I/O) page faults — это промахи, которые пошли за данными на диск. Сравни её на двух прогонах: один работник против двух. Ставлю на разницу раз в десять. Если опять накосячил с прогнозом — поправлюсь завтра, я так умею)).
И домашний бенчмарк на субботу. Один большой файл, два прогона подряд: второй должен быть заметно быстрее, файл уже в кэше. Потом то же самое с двумя работниками на двух больших — кэш на оба не влезает, и оба прогона одинаково медленные. Если картина именно такая, диагноз закрыт. Я со своей стороны сегодня погоняю похожее на восьми гигах, вечером сравним.
Что делать. Дешёвый вариант: большие файлы в отдельную очередь, один работник, пусть ждут своей очереди — пик полтора гига ты теперь знаешь, режь по нему. Дорогой: у меня heka, восемь гигабайт, там два таких работника влезают и на кэш ещё остаётся. Но сначала очередь, она бесплатная.
Кстати, а что у тебя ещё крутится на этих четырёх гигах? Если там докер-зверинец с вебмордой, работникам достаётся не 4, а гига три, и всё съезжается ещё раньше. Скинь free -m в спокойном состоянии — интересно, насколько я жесток в прогнозах ))