Приложение Qt убито из-за нехватки памяти (OOM)

Я запускаю приложение Qt на встроенной платформе Linux. Система имеет 128 МБ ОЗУ, 512 МБ NAND, без подкачки. Приложение использует пользовательскую библиотеку для периферийных устройств, все остальные — библиотеки Qt и c / c ++. Приложение также использует SQLITE3.

Через 2-3 часа машина начинает работать очень медленно, команды оболочки реагируют примерно на 10 секунд. В конце концов машина зависает, и, наконец, OOM Killer убивает приложение, и система начинает вести себя с нормальной скоростью.

После некоторых наблюдений за использованием системной памяти Топ Команда показывает, что во время работы приложения система свободно память уменьшается, в то время как горбыль продолжает расти. Это снимки Топ нижеприведенный. Приложение названо хуг.

При запуске приложения:

Mem total:126164 anon:3308 map:8436 free:32456
slab:60936 buf:0 cache:27528 dirty:0 write:0
Swap total:0 free:0
PID   VSZ VSZRW^  RSS (SHR) DIRTY (SHR) STACK COMMAND
776 29080  9228  8036   528   968     0    84 ./xyz -qws
781  3960   736  1976  1456   520     0    84 sshd: root@notty
786  3676   680  1208   764   416     0    88 /usr/libexec/sftp-server
770  3792   568  1948  1472   464     0    84 {sshd} sshd: root@pts/0
766  3792   568   956   688   252     0    84 /usr/sbin/sshd
388  1864   284   552   332   188     0    84 udevd --daemon
789  2832   272   688   584    84     0    84 top
774  2828   268   668   560    84     0    84 -sh
709  2896   268   556   464    80     0    84 /usr/sbin/inetd
747  2828   268   596   516    68     0    84 /sbin/getty -L ttymxc0 115200 vt100
777  2824   264   444   368    68     0    84 tee out.log
785  2824   264   484   416    68     0    84 sh -c /usr/libexec/sftp-server
1  2824   264   556   488    64     0    84 init

Через некоторое время :

    Mem total:126164 anon:3312 map:8440 free:9244
slab:83976 buf:0 cache:27584 dirty:0 write:0
Swap total:0 free:0
PID   VSZ VSZRW^  RSS (SHR) DIRTY (SHR) STACK COMMAND
776 29080  9228  8044   528   972     0    84 ./xyz -qws
781  3960   736  1976  1456   520     0    84 sshd: root@notty
786  3676   680  1208   764   416     0    88 /usr/libexec/sftp-server
770  3792   568  1948  1472   464     0    84 {sshd} sshd: root@pts/0
766  3792   568   956   688   252     0    84 /usr/sbin/sshd
388  1864   284   552   332   188     0    84 udevd --daemon
789  2832   272   688   584    84     0    84 top
774  2828   268   668   560    84     0    84 -sh
709  2896   268   556   464    80     0    84 /usr/sbin/inetd
747  2828   268   596   516    68     0    84 /sbin/getty -L ttymxc0 115200 vt100
777  2824   264   444   368    68     0    84 tee out.log
785  2824   264   484   416    68     0    84 sh -c /usr/libexec/sftp-server
1  2824   264   556   488    64     0    84 init

Как ни странно, я не вижу каких-либо серьезных изменений в выводе Топ с участием самого приложения. В конце концов приложение убито, Топ вывод после этого:

    Mem total:126164 anon:2356 map:916 free:2368
slab:117944 buf:0 cache:1580 dirty:0 write:0
Swap total:0 free:0
PID   VSZ VSZRW^  RSS (SHR) DIRTY (SHR) STACK COMMAND
781  3960   736   708   184   520     0    84 sshd: root@notty
786  3724   728   736   172   484     0    88 /usr/libexec/sftp-server
770  3792   568   648   188   460     0    84 {sshd} sshd: root@pts/0
766  3792   568   252     0   252     0    84 /usr/sbin/sshd
388  1864   284   188     0   188     0    84 udevd --daemon
819  2832   272   676   348    84     0    84 top
774  2828   268   512   324    96     0    84 -sh
709  2896   268    80     0    80     0    84 /usr/sbin/inetd
747  2828   268    68     0    68     0    84 /sbin/getty -L ttymxc0 115200 vt100
785  2824   264    68     0    68     0    84 sh -c /usr/libexec/sftp-server
1  2824   264    64     0    64     0    84 init

dmesg показывает:

sh invoked oom-killer: gfp_mask=0xd0, order=2, oomkilladj=0
[<c002d4c4>] (unwind_backtrace+0x0/0xd4) from [<c0073ac0>]              (oom_kill_process+0x54/0x1b8)
[<c0073ac0>] (oom_kill_process+0x54/0x1b8) from [<c0073f14>] (__out_of_memory+0x154/0x178)
[<c0073f14>] (__out_of_memory+0x154/0x178) from [<c0073fa0>] (out_of_memory+0x68/0x9c)
[<c0073fa0>] (out_of_memory+0x68/0x9c) from [<c007649c>] (__alloc_pages_nodemask+0x3e0/0x4c8)
[<c007649c>] (__alloc_pages_nodemask+0x3e0/0x4c8) from [<c0076598>] (__get_free_pages+0x14/0x4c)
[<c0076598>] (__get_free_pages+0x14/0x4c) from [<c002f528>] (get_pgd_slow+0x14/0xdc)
[<c002f528>] (get_pgd_slow+0x14/0xdc) from [<c0043890>] (mm_init+0x84/0xc4)
[<c0043890>] (mm_init+0x84/0xc4) from [<c0097b94>] (bprm_mm_init+0x10/0x138)
[<c0097b94>] (bprm_mm_init+0x10/0x138) from [<c00980a8>] (do_execve+0xf4/0x2a8)
[<c00980a8>] (do_execve+0xf4/0x2a8) from [<c002afc4>] (sys_execve+0x38/0x5c)
[<c002afc4>] (sys_execve+0x38/0x5c) from [<c0027d20>] (ret_fast_syscall+0x0/0x2c)
Mem-info:
DMA per-cpu:
CPU    0: hi:    0, btch:   1 usd:   0
Normal per-cpu:
CPU    0: hi:   42, btch:   7 usd:   0
Active_anon:424 active_file:11 inactive_anon:428
inactive_file:3 unevictable:0 dirty:0 writeback:0 unstable:0
free:608 slab:29498 mapped:14 pagetables:59 bounce:0
DMA free:692kB min:268kB low:332kB high:400kB active_anon:0kB inactive_anon:0kB active_file:4kB inactive_file:0kB unevictable:0kB present:24384kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 103 103
Normal free:1740kB min:1168kB low:1460kB high:1752kB active_anon:1696kB inactive_anon:1712kB active_file:40kB inactive_file:12kB unevictable:0kB present:105664kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 0 0
DMA: 3*4kB 3*8kB 5*16kB 2*32kB 4*64kB 2*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 692kB
Normal: 377*4kB 1*8kB 4*16kB 1*32kB 2*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 1740kB
30 total pagecache pages
0 pages in swap cache
Swap cache stats: add 0, delete 0, find 0/0
Free swap  = 0kB
Total swap = 0kB
32768 pages of RAM
687 free pages
1306 reserved pages
29498 slab pages
59 pages shared
0 pages swap cached
Out of memory: kill process 774 (sh) score 339 or a child
Killed process 776 (xyz)

Итак, очевидно, что произошла утечка памяти, это должно быть мое приложение, так как мое приложение убито. Но я не делаю никаких таНос с из программы. Я позаботился о том, чтобы ограничить область видимости переменных, чтобы они освобождались после их использования. Так что я в полной растерянности относительно того, почему горбыль увеличивается в Топ выход. я пытался http://valgrind.org/docs/manual/faq.html#faq.reports но не сработало.

В настоящее время пытаюсь использовать Valgrind на рабочем столе (поскольку я читал, он работает только для arm-cortex), чтобы проверить мою бизнес-логику.

Дополнительная информация:

root@freescale ~/Application/app$ uname -a
Linux freescale 2.6.31-207-g7286c01 #2053 Fri Jun 22 10:29:11 IST 2012 armv5tejl GNU/Linux
Compiler : arm-none-linux-gnueabi-4.1.2 glibc2.5
cpp libs : libstdc++.so.6.0.8
Qt : 4.7.3 libs

Любые указатели будут с благодарностью …

3

Решение

Я не думаю, что проблема прямо в вашем коде.
Причина очевидна: пространство вашего приложения не увеличивается (и RSS, и VSW не увеличиваются).

Тем не менее, вы видите, что количество плит увеличивается. Вы не можете использовать или увеличивать количество слябов в вашем приложении — это только ядро.

Некоторые очевидные причины увеличения размера плиты из верхней части моей головы:

  • вы никогда не закрываете сетевые сокеты
  • Вы читаете много файлов, но никогда не закрываете их
  • вы используете много ioctls

Я бы запустил strace и какое-то время смотрел на его вывод. strace перехватывает взаимодействия с ядром. Если у вас проблемы с памятью, я бы ожидал повторных вызовов brk (). Если у вас есть другие проблемы, вы увидите повторные звонки, чтобы открыть без закрытия.

3

Другие решения

Если у вас есть распределение структуры данных, проверьте правильность добавления потомков и т. Д. У меня была похожая ошибка в моем коде. Также, если вы делаете большие и большие запросы к базе данных, она может использовать больше оперативной памяти. Попробуйте найти какой-нибудь детектор утечки памяти, чтобы определить, есть ли утечка.

1

По вопросам рекламы [email protected]