나는 (잠재적으로) 매우 큰 문제 영역을 생성하는 데 의존하는 시뮬레이터를 작성하고 있습니다. RAM은 데이터를 저장할 수 없기 때문에 4개의 쿼드 메모리 매핑 파일을 사용하여 저장합니다. 이는 8GB RAM을 갖춘 64비트 Linux에서 실행되는 64비트 애플리케이션입니다.
내 응용 프로그램은 여러 스레드에서 메모리 맵을 반복하고 해당 스레드에서 읽기 및 쓰기 작업을 수행합니다. 그러나 내 프로그램은 시작 직후 OOM을 발생시킵니다(스래싱이 발생하지 않음).
[ 683.899682] Purging GPU memory, 25 pages freed, 12838 pages still pinned.
[ 683.899683] 50 and 0 pages still available in the bound and unbound GPU page lists.
[ 683.899732] Purging GPU memory, 0 pages freed, 12838 pages still pinned.
[ 683.899732] 50 and 0 pages still available in the bound and unbound GPU page lists.
[ 683.901441] gnome-shell invoked oom-killer: gfp_mask=0x240c0d0(GFP_TEMPORARY|__GFP_COMP|__GFP_ZERO), order=3, oom_score_adj=0
[ 683.901443] gnome-shell cpuset=/ mems_allowed=0
[ 683.901446] CPU: 0 PID: 1714 Comm: gnome-shell Not tainted 4.8.8-300.fc25.x86_64 #1
[ 683.901447] Hardware name: Dell Inc. XPS 13 9350/0PWNCR, BIOS 1.4.4 06/14/2016
[ 683.901449] 0000000000000286 000000006699dcf4 ffff8c743292b588 ffffffff863e5dbd
[ 683.901451] ffff8c743292b748 ffff8c73d7431f00 ffff8c743292b5f0 ffffffff8624c1f8
[ 683.901453] 000000006699dcf4 000000006699dcf4 ffffffff86e9cac0 0000000000000015
[ 683.901454] Call Trace:
[ 683.901459] [<ffffffff863e5dbd>] dump_stack+0x63/0x86
[ 683.901460] [<ffffffff8624c1f8>] dump_header+0x5c/0x1d5
[ 683.901463] [<ffffffff861bd90c>] oom_kill_process+0x20c/0x3d0
[ 683.901465] [<ffffffff860aacfe>] ? has_capability_noaudit+0x1e/0x30
[ 683.901466] [<ffffffff861bde76>] out_of_memory+0x356/0x440
[ 683.901468] [<ffffffff861c3df0>] __alloc_pages_nodemask+0xe90/0xeb0
[ 683.901470] [<ffffffff8621a055>] alloc_pages_current+0x95/0x140
[ 683.901472] [<ffffffff861e54be>] kmalloc_order_trace+0x2e/0xd0
[ 683.901508] [<ffffffffc03962b6>] ? gen9_read32+0x166/0x3a0 [i915]
[ 683.901510] [<ffffffff8622782d>] __kmalloc+0x1cd/0x1f0
[ 683.901525] [<ffffffffc036eaae>] ? alloc_gen8_temp_bitmaps+0x2e/0x80 [i915]
[ 683.901537] [<ffffffffc036eac7>] alloc_gen8_temp_bitmaps+0x47/0x80 [i915]
[ 683.901552] [<ffffffffc036eb9c>] gen8_alloc_va_range_3lvl+0x9c/0x9f0 [i915]
[ 683.901553] [<ffffffff861b896b>] ? find_lock_entry+0x5b/0x140
[ 683.901555] [<ffffffff86411003>] ? swiotlb_map_sg_attrs+0x53/0x130
[ 683.901567] [<ffffffffc036f88c>] gen8_alloc_va_range+0x23c/0x470 [i915]
[ 683.901580] [<ffffffffc0370e5b>] i915_vma_bind+0x9b/0x180 [i915]
[ 683.901593] [<ffffffffc03774fb>] i915_gem_object_do_pin+0x86b/0xa60 [i915]
[ 683.901606] [<ffffffffc037771d>] i915_gem_object_pin+0x2d/0x30 [i915]
[ 683.901618] [<ffffffffc0365acf>] i915_gem_execbuffer_reserve_vma.isra.20+0x9f/0x180 [i915]
[ 683.901633] [<ffffffffc0365f3b>] i915_gem_execbuffer_reserve.isra.21+0x38b/0x3b0 [i915]
[ 683.901646] [<ffffffffc03671d8>] i915_gem_do_execbuffer.isra.24+0x6b8/0x1200 [i915]
[ 683.901648] [<ffffffff861b87d0>] ? find_get_entry+0x20/0x160
[ 683.901650] [<ffffffff861d9b99>] ? shmem_getpage_gfp+0xd9/0xc90
[ 683.901661] [<ffffffffc0368944>] i915_gem_execbuffer2+0x104/0x260 [i915]
[ 683.901691] [<ffffffffc0250fa0>] drm_ioctl+0x200/0x4f0 [drm]
[ 683.901704] [<ffffffffc0368840>] ? i915_gem_execbuffer+0x330/0x330 [i915]
[ 683.901705] [<ffffffff862692ff>] ? dput+0x21f/0x260
[ 683.901707] [<ffffffff86264cd3>] do_vfs_ioctl+0xa3/0x5f0
[ 683.901708] [<ffffffff86265299>] SyS_ioctl+0x79/0x90
[ 683.901710] [<ffffffff868027b2>] entry_SYSCALL_64_fastpath+0x1a/0xa4
[ 683.901711] Mem-Info:
[ 683.901714] active_anon:95440 inactive_anon:114637 isolated_anon:0
active_file:1284097 inactive_file:231741 isolated_file:0
unevictable:31 dirty:107 writeback:155137 unstable:0
slab_reclaimable:34416 slab_unreclaimable:15787
mapped:1373800 shmem:49734 pagetables:32919 bounce:0
free:26810 free_pcp:0 free_cma:0
[ 683.901717] Node 0 active_anon:381760kB inactive_anon:458548kB active_file:5136388kB inactive_file:926964kB unevictable:124kB isolated(anon):0kB isolated(file):0kB mapped:5495200kB dirty:428kB writeback:620548kB shmem:0kB shmem_thp: 0kB shmem_pmdmapped: 0kB anon_thp: 198936kB writeback_tmp:0kB unstable:0kB pages_scanned:0 all_unreclaimable? no
[ 683.901718] Node 0 DMA free:15872kB min:132kB low:164kB high:196kB active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:0kB unevictable:0kB writepending:0kB present:15980kB managed:15896kB mlocked:0kB slab_reclaimable:0kB slab_unreclaimable:24kB kernel_stack:0kB pagetables:0kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB
[ 683.901720] lowmem_reserve[]: 0 1829 7809 7809 7809
[ 683.901723] Node 0 DMA32 free:39676kB min:15796kB low:19744kB high:23692kB active_anon:2196kB inactive_anon:180kB active_file:1467288kB inactive_file:152024kB unevictable:0kB writepending:120700kB present:1958284kB managed:1892644kB mlocked:0kB slab_reclaimable:34852kB slab_unreclaimable:4228kB kernel_stack:32kB pagetables:27600kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB
[ 683.901725] lowmem_reserve[]: 0 0 5980 5980 5980
[ 683.901727] Node 0 Normal free:51692kB min:51648kB low:64560kB high:77472kB active_anon:379564kB inactive_anon:458368kB active_file:3669100kB inactive_file:774940kB unevictable:124kB writepending:500276kB present:6275072kB managed:6128020kB mlocked:124kB slab_reclaimable:102812kB slab_unreclaimable:58896kB kernel_stack:8288kB pagetables:104076kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB
[ 683.901729] lowmem_reserve[]: 0 0 0 0 0
[ 683.901731] Node 0 DMA: 0*4kB 0*8kB 2*16kB (U) 1*32kB (U) 3*64kB (U) 2*128kB (U) 0*256kB 0*512kB 1*1024kB (U) 1*2048kB (M) 3*4096kB (M) = 15872kB
[ 683.901738] Node 0 DMA32: 6599*4kB (UME) 1573*8kB (UM) 51*16kB (UM) 0*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 39796kB
[ 683.901744] Node 0 Normal: 11012*4kB (UMEH) 955*8kB (UMH) 11*16kB (H) 1*32kB (H) 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 51896kB
[ 683.901750] Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=1048576kB
[ 683.901751] Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB
[ 683.901752] 1565598 total pagecache pages
[ 683.901752] 0 pages in swap cache
[ 683.901753] Swap cache stats: add 0, delete 0, find 0/0
[ 683.901754] Free swap = 8126460kB
[ 683.901754] Total swap = 8126460kB
[ 683.901754] 2062334 pages RAM
[ 683.901755] 0 pages HighMem/MovableOnly
[ 683.901755] 53194 pages reserved
[ 683.901755] 0 pages cma reserved
[ 683.901756] 0 pages hwpoisoned
[ 683.901756] [ pid ] uid tgid total_vm rss nr_ptes nr_pmds swapents oom_score_adj name
[ 683.901771] [ 771] 0 771 19588 1983 34 3 0 0 systemd-journal
[ 683.901773] [ 802] 0 802 32268 1616 29 3 0 0 lvmetad
[ 683.901775] [ 808] 0 808 11972 1901 25 3 0 -1000 systemd-udevd
[ 683.901778] [ 987] 0 987 13888 834 27 3 0 -1000 auditd
[ 683.901779] [ 998] 0 998 21136 443 12 3 0 0 audispd
[ 683.901781] [ 1001] 0 1001 10907 520 26 3 0 0 sedispatch
[ 683.901782] [ 1011] 0 1011 1104 180 8 3 0 0 rngd
[ 683.901783] [ 1012] 0 1012 4220 343 13 3 0 0 alsactl
[ 683.901784] [ 1013] 0 1013 98858 1754 45 3 0 0 accounts-daemon
[ 683.901785] [ 1015] 0 1015 10882 1188 23 3 0 0 bluetoothd
[ 683.901786] [ 1017] 0 1017 104437 2240 73 4 0 0 ModemManager
[ 683.901787] [ 1018] 172 1018 46710 823 28 3 0 0 rtkit-daemon
[ 683.901788] [ 1020] 0 1020 1642 478 9 3 0 0 mcelog
[ 683.901790] [ 1022] 81 1022 14507 1493 27 3 0 -900 dbus-daemon
[ 683.901791] [ 1026] 990 1026 28014 782 25 3 0 0 chronyd
[ 683.901792] [ 1036] 0 1036 51991 804 38 3 0 0 gssproxy
[ 683.901794] [ 1048] 0 1048 167266 8834 105 4 0 0 firewalld
[ 683.901795] [ 1050] 0 1050 12558 1987 28 3 0 0 systemd-logind
[ 683.901797] [ 1052] 70 1052 12579 990 28 3 0 0 avahi-daemon
[ 683.901798] [ 1057] 995 1057 133403 3831 56 3 0 0 polkitd
[ 683.901799] [ 1059] 0 1059 111734 2268 64 3 0 0 abrtd
[ 683.901800] [ 1066] 70 1066 12547 89 27 3 0 0 avahi-daemon
[ 683.901801] [ 1086] 0 1086 156436 3838 85 3 0 0 NetworkManager
[ 683.901802] [ 1110] 0 1110 228634 8292 174 4 0 0 libvirtd
[ 683.901803] [ 1122] 0 1122 102461 2029 47 3 0 0 gdm
[ 683.901804] [ 1125] 0 1125 33234 810 19 3 0 0 crond
[ 683.901805] [ 1126] 0 1126 6490 534 19 3 0 0 atd
[ 683.901806] [ 1213] 0 1213 93009 2339 67 4 0 0 gdm-session-wor
[ 683.901807] [ 1222] 0 1222 16576 1873 36 3 0 0 wpa_supplicant
[ 683.901808] [ 1236] 42 1236 16516 1785 36 3 0 0 systemd
[ 683.901809] [ 1238] 42 1238 24758 780 47 3 0 0 (sd-pam)
[ 683.901810] [ 1242] 42 1242 112470 2665 94 3 0 0 gdm-wayland-ses
[ 683.901811] [ 1244] 42 1244 14131 1121 28 3 0 0 dbus-daemon
[ 683.901812] [ 1247] 42 1247 172808 3320 110 4 0 0 gnome-session-b
[ 683.901813] [ 1255] 42 1255 403569 27848 305 5 0 0 gnome-shell
[ 683.901814] [ 1270] 0 1270 107218 2323 53 4 0 0 upowerd
[ 683.901816] [ 1277] 0 1277 261220 3428 344 4 0 0 abrt-dump-journ
[ 683.901817] [ 1279] 0 1279 262477 3538 345 4 0 0 abrt-dump-journ
[ 683.901818] [ 1338] 99 1338 12274 92 26 3 0 0 dnsmasq
[ 683.901819] [ 1339] 0 1339 12267 92 26 3 0 0 dnsmasq
[ 683.901820] [ 1420] 42 1420 62218 11072 107 3 0 0 Xwayland
[ 683.901822] [ 1426] 42 1426 86174 1417 36 3 0 0 at-spi-bus-laun
[ 683.901823] [ 1431] 42 1431 14074 920 27 3 0 0 dbus-daemon
[ 683.901824] [ 1434] 42 1434 55841 1513 42 4 0 0 at-spi2-registr
[ 683.901825] [ 1440] 42 1440 164934 2682 84 4 0 0 pulseaudio
[ 683.901826] [ 1453] 42 1453 115040 2138 39 3 0 0 ibus-daemon
[ 683.901827] [ 1456] 42 1456 95634 1424 38 3 0 0 ibus-dconf
[ 683.901828] [ 1459] 42 1459 126126 6717 129 3 0 0 ibus-x11
[ 683.901829] [ 1465] 42 1465 109804 2173 59 3 0 0 xdg-permission-
[ 683.901830] [ 1473] 0 1473 196027 18444 150 3 0 0 packagekitd
[ 683.901831] [ 1477] 42 1477 302617 9107 200 5 0 0 gnome-settings-
[ 683.901832] [ 1497] 42 1497 77184 1362 34 3 0 0 ibus-engine-sim
[ 683.901833] [ 1538] 993 1538 103715 2539 54 3 0 0 colord
[ 683.901834] [ 1583] 0 1583 98709 2395 77 3 0 0 gdm-session-wor
[ 683.901835] [ 1592] 0 1592 21780 4717 46 3 0 0 dhclient
[ 683.901836] [ 1641] 0 1641 84698 2398 50 4 0 0 nm-openvpn-serv
[ 683.901837] [ 1645] 988 1645 17970 1854 40 3 0 0 openvpn
[ 683.901838] [ 1648] 1000 1648 16517 1756 34 4 0 0 systemd
[ 683.901839] [ 1656] 1000 1656 24794 801 47 3 0 0 (sd-pam)
[ 683.901840] [ 1666] 1000 1666 118117 2041 44 3 0 0 gnome-keyring-d
[ 683.901841] [ 1669] 1000 1669 112470 2807 97 3 0 0 gdm-wayland-ses
[ 683.901843] [ 1671] 1000 1671 14340 1294 30 3 0 0 dbus-daemon
[ 683.901844] [ 1674] 1000 1674 172877 3440 114 4 0 0 gnome-session-b
[ 683.901845] [ 1686] 1000 1686 98759 1747 42 3 0 0 gvfsd
[ 683.901846] [ 1691] 1000 1691 104451 1327 37 3 0 0 gvfsd-fuse
[ 683.901847] [ 1714] 1000 1714 447111 39711 335 5 0 0 gnome-shell
[ 683.901848] [ 1729] 1000 1729 62884 11611 111 3 0 0 Xwayland
[ 683.901849] [ 1735] 1000 1735 86177 1474 36 4 0 0 at-spi-bus-laun
[ 683.901850] [ 1740] 1000 1740 14106 1108 29 3 0 0 dbus-daemon
[ 683.901851] [ 1743] 1000 1743 55841 1516 46 3 0 0 at-spi2-registr
[ 683.901852] [ 1749] 1000 1749 173283 3029 102 4 0 0 pulseaudio
[ 683.901853] [ 1765] 1000 1765 221322 8359 193 4 0 0 gnome-shell-cal
[ 683.901854] [ 1766] 1000 1766 115001 2100 41 4 0 0 ibus-daemon
[ 683.901855] [ 1770] 1000 1770 95645 1397 37 3 0 0 ibus-dconf
[ 683.901855] [ 1772] 1000 1772 126126 6529 126 4 0 0 ibus-x11
[ 683.901856] [ 1782] 1000 1782 229523 9384 213 4 0 0 evolution-sourc
[ 683.901857] [ 1785] 1000 1785 109804 2197 62 4 0 0 xdg-permission-
[ 683.901858] [ 1794] 1000 1794 105580 2119 55 3 0 0 gvfs-udisks2-vo
[ 683.901859] [ 1801] 0 1801 97029 2083 54 3 0 0 udisksd
[ 683.901860] [ 1808] 1000 1808 222729 7688 172 4 0 0 goa-daemon
[ 683.901861] [ 1811] 1000 1811 98629 1391 40 3 0 0 gvfs-gphoto2-vo
[ 683.901862] [ 1817] 1000 1817 94552 1372 35 3 0 0 gvfs-goa-volume
[ 683.901864] [ 1827] 1000 1827 136872 2734 108 3 0 0 goa-identity-se
[ 683.901865] [ 1829] 1000 1829 96354 1300 38 3 0 0 gvfs-mtp-volume
[ 683.901866] [ 1836] 1000 1836 122361 2095 53 4 0 0 gvfs-afc-volume
[ 683.901867] [ 1848] 1000 1848 322422 10974 240 5 0 0 gnome-settings-
[ 683.901868] [ 1861] 1000 1861 269205 10731 229 4 0 0 evolution-calen
[ 683.901870] [ 1889] 1000 1889 77225 1429 35 3 0 0 ibus-engine-sim
[ 683.901871] [ 1981] 1000 1981 290746 9893 206 4 0 0 evolution-calen
[ 683.901872] [ 1993] 1000 1993 163552 5140 89 4 0 0 tracker-miner-f
[ 683.901873] [ 1995] 1000 1995 158399 4233 78 4 0 0 tracker-miner-a
[ 683.901874] [ 1999] 1000 1999 185785 4846 96 4 0 0 tracker-extract
[ 683.901875] [ 2010] 1000 2010 140701 4027 79 4 0 0 tracker-miner-u
[ 683.901876] [ 2011] 0 2011 52365 1984 53 3 0 0 cupsd
[ 683.901878] [ 2017] 1000 2017 46916 1268 27 4 0 0 dconf-service
[ 683.901879] [ 2021] 1000 2021 265817 9429 221 4 0 0 evolution-addre
[ 683.901880] [ 2023] 1000 2023 272624 9896 198 4 0 0 evolution-calen
[ 683.901881] [ 2027] 1000 2027 133874 3898 60 4 0 0 tracker-store
[ 683.901882] [ 2043] 1000 2043 160491 3462 122 4 0 0 gsd-printer
[ 683.901883] [ 2051] 1000 2051 168185 6168 137 3 0 0 abrt-applet
[ 683.901884] [ 2054] 1000 2054 83177 4194 112 3 0 0 seapplet
[ 683.901885] [ 2071] 1000 2071 308067 9309 203 4 0 0 evolution-addre
[ 683.901886] [ 2127] 1000 2127 657040 48104 313 6 0 0 insync
[ 683.901887] [ 2133] 0 2133 85913 2519 64 4 0 -900 abrt-dbus
[ 683.901888] [ 2163] 1000 2163 45120 1422 39 3 0 0 gconfd-2
[ 683.901890] [ 2200] 1000 2200 77445 1596 35 4 0 0 gvfsd-metadata
[ 683.901891] [ 2215] 1000 2215 203657 11515 145 4 0 0 gnome-terminal-
[ 683.901892] [ 2235] 1000 2235 117765 1710 47 3 0 0 gvfsd-trash
[ 683.901893] [ 2309] 1000 2309 30789 1208 15 3 0 0 bash
[ 683.901895] [ 2397] 1000 2397 170605 13763 148 4 0 0 gnome-system-mo
[ 683.901896] [ 3036] 1000 3036 12251152 1306699 23712 50 0 0 SyrenProcessor_
[ 683.901897] [ 3042] 1000 3042 30763 1084 14 3 0 0 bash
[ 683.901899] [ 3122] 1000 3122 30267 247 12 3 0 0 dmesg
[ 683.901900] Out of memory: Kill process 3036 (SyrenProcessor_) score 329 or sacrifice child
[ 683.901928] Killed process 3036 (SyrenProcessor_) total-vm:49004608kB, anon-rss:1368kB, file-rss:5226416kB, shmem-rss:0kB
보시다시피 내 애플리케이션은 메모리 맵에서 약 50GB를 절약합니다.
내 가설은 내 응용 프로그램이 가상 주소 공간의 데이터에 액세스할 때 Linux가 해당 주소가 어느 페이지에 있는지 파악하고 RAM에 없으면 페이지 오류를 발생시켜 디스크에서 해당 페이지를 가져오는 것입니다. 이 가정 하에서 RAM의 페이지 수는 메모리 맵에 액세스하는 스레드 수와 동일합니다. 실제로 Linux는 성능 향상을 위해 가능한 많은 페이지를 캐시하지만 Linux는 필요에 따라 더 적은 수의 활성 페이지를 삭제해야 한다는 것을 알고 있습니다. 그게 문제가 되지는 않겠죠. 그렇기 때문에 메모리 매핑을 사용할 때 OOM 오류가 발생하지 않을 것이라고 생각합니다(디스크 공간이 있고 64비트 주소 범위를 초과하지 않는다고 가정). 분명히 그렇지 않은데, 누구든지 내 가정을 바로잡을 수 있습니까?
anon-rss:1368kB
내 응용 프로그램은 자체 기능을 구현하기 위해 매우 적은 양의 RAM을 사용하고 file-rss:5226416kB
5.2GB의 메모리 매핑 데이터를 RAM에 맞추려고 하며 이미 그만큼의 사용 가능한 메모리가 있음을 나타내기 때문에 마지막 줄이 타당해 보입니다.
그렇다면 OOM이 트리거되는 이유는 무엇입니까?
답변1
Linux에서는 대부분의 프로그램이 실제로 필요한 것보다 더 많은 메모리를 요구하고 메모리가 발견되면 걱정하기 때문에 메모리 초과 할당을 허용합니다.가지다실제로 메모리를 과도하게 할당하고 OOM 킬러를 실행합니다.
sysctl vm.overcommit_memory가 도움이 될 수 있습니다. 이를 2로 설정하면 OS가 처리할 수 없는 작업을 수행할 때 최선의 결과를 기대하기보다는 OS에서 오류를 발생하게 됩니다.
데이터를 보관할 수 있을 만큼 큰 스왑 파티션/파일이 있으면 예상대로 작동할 수 있습니다.
또는 파일 자체가 너무 큰 문제일 수 있으므로 mmap2()가 더 나은 선택일 수 있습니다.