Created attachment 14245 [details] Пример файла /etc/freeswitch/file.gif Описание ошибки =============== 1. Настроить сервер с freeswitch: # apt-get install -y freeswitch-daemon freeswitch-lang-ru freeswitch-sounds-ru-ru-elena-* # sed -i "/default_password/s/1234/Pa##word/" /etc/freeswitch/vars.xml # sed -i "s/<include>/<include>\n<X-PRE-PROCESS cmd=\"set\" data=\"force_local_ip_v4=$(hostname -i)\"\/>\n<X-PRE-PROCESS cmd=\"set\" data=\"local_ip_v4=\$\${force_local_ip_v4}\"\/>/" /etc/freeswitch/vars.xml # systemctl enable freeswitch; systemctl start freeswitch; systemctl status freeswitch Дополнительно может быть необходимо выполнить команду "reload mod_imagick" в fs_cli. 2. Настроить linphone на клиенте: * При запуске закрыть мастер настройки. * Открыть Опции > Параметры > вкладка по умолчанию Управление учётными записями SIP > в разделе Учётные записи нажать Добавить. * Ввести данные: ** Ваш идентификатор SIP: sip:1000@<ip-адрес сервера c freeswitch> ** Адрес SIP прокси: sip:<ip-адрес сервера c freeswitch>:5080 ** Остальные параметры оставить по умолчанию. ** При запросе ввести пароль по умолчанию (Pa##word). * Закрыть окно настроек. 3. Включить модуль и настроить его использование на сервере freeswitch *с параметром lazy=1*: # apt-get install -y freeswitch-imagick # sed -i "s/<\/modules>/<load module=\"mod_imagick\"\/><\/modules>/" /etc/freeswitch/autoload_configs/modules.conf.xml # systemctl restart freeswitch; sleep 3; systemctl status freeswitch # sed -i "s/<context name=\"public\">/<context name=\"public\">\n<extension name=\"public_extensions\">\n<condition field=\"destination_number\" expression=\"^1007$\">\n<action application=\"answer\"\/>\n<action application=\"playback\" data=\"{lazy=1}\/etc\/freeswitch\/file.gif\"\/>\n <\/condition>\n<\/extension>/" /etc/freeswitch/dialplan/public.xml # fs_cli freeswitch@...> reloadxml (не выходить из консоли для наблюдения за логами) 4. Поместить в файл /etc/freeswitch/file.gif на сервере любой gif-файл (например, из вложения). 5. Позвонить с клиента на номер 1007. Фактический результат: Модуль бесконечно загружает одно и то же изображение, после чего процесс завершается из-за OOM: > [...] > [DEBUG] mod_imagick.c:115 /etc/freeswitch/file.gif page 1932 loaded > [DEBUG] mod_imagick.c:115 /etc/freeswitch/file.gif page 1933 loaded > [DEBUG] mod_imagick.c:115 /etc/freeswitch/file.gif page 1934 loaded > [DEBUG] mod_imagick.c:115 /etc/freeswitch/file.gif page 1935 loaded > [DEBUG] mod_imagick.c:115 /etc/freeswitch/file.gif page 1936 loaded > [DEBUG] mod_imagick.c:115 /etc/freeswitch/file.gif page 1937 loaded В journalctl: > kernel: qemu-ga invoked oom-killer: gfp_mask=0x140cca(GFP_HIGHUSER_MOVABLE|__GFP_COMP), order=0, oom_score_adj=0 > [...] > kernel: Tasks state (memory values in pages): > kernel: [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name > [...] > kernel: [ 4683] 463 4683 1371359 673475 7036928 151021 0 freeswitch > kernel: oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/system.slice/freeswitch.service,task=freeswitch,pid=4683,uid=463 > kernel: Out of memory: Killed process 4683 (freeswitch) total-vm:5485436kB, anon-rss:2584824kB, file-rss:0kB, shmem-rss:109076kB, UID:463 pgtables:6872kB oom_score_adj:0 > systemd[1]: freeswitch.service: A process of this unit has been killed by the OOM killer. > freeswitch[4762]: freeswitch shutdown succeeded > freeswitch[4752]: Service freeswitch is not running.[PASSED] > systemd[1]: freeswitch.service: Main process exited, code=killed, status=9/KILL > systemd[1]: freeswitch.service: Failed with result 'oom-kill'. При размере gif-файла в 5 MB нехватку на системе с памятью 3 GB можно вызвать после ~22 загрузок, на 4 GB - после ~29. Ожидаемый результат: Бесконечная загрузка не происходит. Дополнительно ============= Возможно, что опция lazy=1 предназначена только для pdf-файлов. С ними она работает корректно, загружается необходимое число страниц: > [INFO] mod_imagick.c:278 Opening File /etc/freeswitch/file.pdf, read the first 1 page(s) > [DEBUG] mod_imagick.c:115 /etc/freeswitch/file.pdf page 2 loaded > [...] > [INFO] mod_imagick.c:135 read file: /etc/freeswitch/file.pdf done, pagecount: 6 > [DEBUG] mod_imagick.c:142 Read Images Thread Ended. Воспроизводимость ================= Воспроизводится на виртуальных машинах: [p10] server-10.1-x86-64 freeswitch-imagick-1.10.9-alt1.x86_64 freeswitch-daemon-1.10.9-alt1.x86_64 [sisyphus] server-10.1-x86-64 freeswitch-imagick-1.10.10-alt1.x86_64 freeswitch-daemon-1.10.10-alt1.x86_64 Клиент - реальная машина: [p10] kworkstation-10.1-x86-64 linphone-3.12.0-alt7.x86_64
в апстрим проекта повесьте пожалуйста.
Открыл ошибку в upstream: https://github.com/signalwire/freeswitch/issues/2221 (mod_imagick infinitely loads GIF files with lazy=1, causing an OOM kill)
В sisyphus c версией пакета freeswitch-imagick-1.10.11-alt1.x86_64 воспроизвести ошибку не удалось.