Bug 47382 - Модуль mod_imagick бесконечно загружает память при использовании опции lazy=1 с gif-файлом
Summary: Модуль mod_imagick бесконечно загружает память при использовании опции lazy=1...
Status: CLOSED WORKSFORME
Alias: None
Product: Sisyphus
Classification: Development
Component: freeswitch-imagick (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 normal
Assignee: Anton Farygin
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2023-08-29 14:17 MSK by Artem Varaksa
Modified: 2024-01-22 16:36 MSK (History)
12 users (show)

See Also:


Attachments
Пример файла /etc/freeswitch/file.gif (118.95 KB, image/gif)
2023-08-29 14:17 MSK, Artem Varaksa
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Artem Varaksa 2023-08-29 14:17:01 MSK
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
Comment 1 Anton Farygin 2023-08-29 14:25:53 MSK
в апстрим проекта повесьте пожалуйста.
Comment 2 Artem Varaksa 2023-08-29 14:39:49 MSK
Открыл ошибку в upstream: https://github.com/signalwire/freeswitch/issues/2221 (mod_imagick infinitely loads GIF files with lazy=1, causing an OOM kill)
Comment 3 Kostevich Arseniy 2024-01-22 16:36:24 MSK
В sisyphus c версией пакета freeswitch-imagick-1.10.11-alt1.x86_64 воспроизвести ошибку не удалось.