У нас есть веб-приложение java spring, работающее внутри модуля kubernetes. Действие конечного пользователя приводит к тому, что веб-приложение запускает Runtime.exec-скрипт GoLang, который, помимо прочего, обрабатывает загруженный файл. Размер файла в моем конкретном случае составляет около 700 МБ.
Проблема, с которой мы столкнулись, заключается в том, что время, затраченное на tar для этого файла, очень непредсказуемо. Это может занять от 20 секунд до 10 минут.
Чтобы сузить проблему, мы развернули модуль kubernetes и запустили только команду tar внутри него.
Время широко варьируется в зависимости от объема памяти, выделенной для модуля. При 4 гигабайтах памяти это займет всего 40 секунд, а при 1,5 гигабайтах это может занять много минут.
У меня максимум 1,5 ядра, выделенных для модуля, и потребление никогда не превышает 1 ядра.
При 512 Мб, выделенных для модуля, команда tar занимает около 11 секунд
root@pod-69fc4988c-km99p:/tmp/test# date;time tar -cvf test.tar
somefile.tar.gz; date
Mon Jul 8 07:11:51 UTC 2019
somefile.tar.gz
real 0m11.313s
user 0m0.009s
sys 0m11.155s
Mon Jul 8 07:12:02 UTC 2019
256 При выделении pod 256 МБ команда tar занимает около 3 минут
root@app-hosting-69fc4988c-km99p:/tmp/test# date;time tar -cvf test.tar somefile.tar.gz; date
Mon Jul 8 07:17:36 UTC 2019
somefile.tar.gz
real 2m52.003s
user 0m0.040s
sys 2m51.856s
Mon Jul 8 07:20:28 UTC 2019
Я не могу понять, почему память pod должна быть фактором, отведенным tar, учитывая, что мы никогда не используем всю доступную память, как показано в статистике top или docker.
Какие другие ресурсы могут быть здесь ограничены?