D 상태의 프로세스가 있지만 시스템 호출이 진행되고 있지 않은 것 같습니다. 이는 CPU 집약적인 프로세스(tensorflow)이며 다른 CPU 집약적인 프로세스(bazel)가 실행되는 동안 중단됩니다. 다음은 몇 가지 진단 정보입니다(이후 cd /proc/4088
).
➜ 4088 uname -a
Linux 4.4.0-62-generic #83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
➜ 4088 sudo cat status
Name: python3
State: D (disk sleep)
(output omitted)
➜ 4088 sudo cat syscall
-1 0x7ffd69619900 0x7f0bec881390
➜ 4088 cat wchan
call_rwsem_down_read_failed%
➜ 4088 sudo cat stack
[] call_rwsem_down_read_failed+0x14/0x30
[] __do_page_fault+0x375/0x400
[] do_page_fault+0x22/0x30
[] page_fault+0x28/0x30
[] 0xffffffffffffffff
또한 컨텍스트 전환 횟수가 증가하지 않는 것을 확인했습니다. 가지다아니요dmesg에 의심스러운 항목이 있습니다:
[69396.390301] BUG: unable to handle kernel paging request at ffffea020f767740
[69396.390306] IP: [] mem_cgroup_try_charge+0x2f/0x1e0
[69396.390308] PGD 25edee067 PUD 0
[69396.390310] Oops: 0000 [#3] SMP
[69396.390338] Modules linked in: dm_snapshot drbg ansi_cprng ctr ccm pci_stub vboxpci(OE) vboxnetadp(OE) vboxnetflt(OE) vboxdrv(OE) binfmt_misc intel_rapl x86_pkg_temp_thermal intel_powerclamp coretemp kvm_intel uvcvideo kvm snd_hda_codec_hdmi videobuf2_vmalloc videobuf2_memops arc4 videobuf2_v4l2 irqbypass videobuf2_core v4l2_common snd_hda_codec_realtek videodev snd_hda_codec_generic crct10dif_pclmul media crc32_pclmul ghash_clmulni_intel snd_hda_intel aesni_intel snd_hda_codec aes_x86_64 lrw ath9k snd_hda_core nvidia_uvm(POE) gf128mul snd_hwdep glue_helper ath9k_common ablk_helper ath9k_hw cryptd snd_pcm ath snd_seq_midi snd_seq_midi_event mac80211 input_leds joydev snd_rawmidi serio_raw snd_seq cfg80211 snd_seq_device snd_timer rtsx_pci_ms memstick snd mei_me soundcore shpchp mei lpc_ich wmi mac_hid
[69396.390353] nfsd auth_rpcgss nfs_acl lockd grace sunrpc parport_pc ppdev lp parport autofs4 dm_thin_pool dm_persistent_data dm_bio_prison dm_bufio libcrc32c hid_generic usbhid hid psmouse rtsx_pci_sdmmc i915 nvidia_drm(POE) nvidia_modeset(POE) i2c_algo_bit drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops nvidia(POE) drm ahci alx libahci rtsx_pci mdio video fjes
[69396.390356] CPU: 4 PID: 4176 Comm: python3 Tainted: P D OE 4.4.0-62-generic #83-Ubuntu
[69396.390357] Hardware name: Hasee QTC6/HM76, BIOS SR161 02/04/2013
[69396.390358] task: ffff8801d987d400 ti: ffff8801c4bd8000 task.ti: ffff8801c4bd8000
[69396.390362] RIP: 0010:[] [] mem_cgroup_try_charge+0x2f/0x1e0
[69396.390363] RSP: 0000:ffff8801c4bdbdd0 EFLAGS: 00010246
[69396.390364] RAX: 017fffc000000000 RBX: ffffea0006565140 RCX: ffff8801c4bdbe68
[69396.390365] RDX: 00000000024000c0 RSI: ffff8801d5401400 RDI: ffffea0006565140
[69396.390365] RBP: ffff8801c4bdbe00 R08: ffffffff81cd2dc4 R09: ffffffff81cd2db3
[69396.390366] R10: 0000000000000000 R11: ffffffff81cd2da2 R12: ffffea020f767740
[69396.390367] R13: ffff8801c4bdbe68 R14: 00000000024000c0 R15: ffff8801d5401400
[69396.390369] FS: 00007f0b9d431700(0000) GS:ffff88025f300000(0000) knlGS:0000000000000000
[69396.390370] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[69396.390371] CR2: ffffea020f767740 CR3: 000000007c070000 CR4: 00000000001406e0
[69396.390371] Stack:
[69396.390373] 0000000000000000 ffffea0006565140 ffff88020b726640 0000000000000000
[69396.390375] ffff88020cf7b4d8 00007f0b53600008 ffff8801c4bdbed0 ffffffff811c1e32
[69396.390377] 0000000000000000 0000000000000000 00007f0b9d42fe00 0000000000000001
[69396.390377] Call Trace:
[69396.390382] [] handle_mm_fault+0x14b2/0x1820
[69396.390386] [] ? do_futex+0x107/0x540
[69396.390389] [] ? blk_finish_plug+0x2c/0x40
[69396.390393] [] ? SyS_madvise+0x48d/0x7d0
[69396.390395] [] ? __schedule+0x3b6/0xa30
[69396.390398] [] __do_page_fault+0x197/0x400
[69396.390401] [] do_page_fault+0x22/0x30
[69396.390404] [] page_fault+0x28/0x30
[69396.390424] Code: 00 55 48 89 e5 41 57 41 56 41 55 41 54 49 89 cd 53 48 83 ec 08 0f 1f 44 00 00 49 09 fc 49 89 f7 41 89 d6 48 8b 07 f6 c4 80 75 6c 8b 04 24 f6 c4 40 0f 84 f0 00 00 00 49 8b 04 24 f6 c4 40 0f
[69396.390427] RIP [] mem_cgroup_try_charge+0x2f/0x1e0
[69396.390427] RSP
[69396.390428] CR2: ffffea020f767740
[69396.390429] ---[ end trace a8c24237c7d97c39 ]---
흥미롭게 /proc/4088/tasks
도4168
4183
4176
이 문제는 다음과 관련될 수 있습니다.https://github.com/bazelbuild/bazel/issues/2445.
왜 붙어 있습니까? 어떡해?
답변1
프로세스의 페이지 오류는 현재 RAM에 매핑되지 않은 메모리 위치에 액세스하여 발생합니다. 프로세스가 SIGSEGV 핸들러를 사용하여 더러운 트릭을 수행하지 않는 한 이는 두 가지 이유로 발생할 수 있습니다. 프로세스에서 매핑되지 않은 주소에 대한 액세스일 수 있으며, 이 경우 프로세스가 충돌할 수 있습니다(버그임). 매핑되었지만 현재 RAM에 없는 주소에 대한 액세스입니다. 후자는 완벽하게 합법적입니다. 현재 캐시에 없는 메모리 매핑된 파일의 위치이거나 현재 스왑 아웃된 할당된 메모리의 위치일 수 있습니다.
페이지 오류는 프로세스에 오류가 발생했음을 의미합니다.프로세서 트랩(매핑되지 않은 메모리 주소에 액세스한 결과입니다.) 트랩은 커널 코드를 호출하고 해당 커널 코드가 실행되는 동안 프로세스는 상태 D(무중단 절전)에 있습니다.
페이지 오류로 인해 커널에 "버그"가 발생합니다. 버그는 버그입니다. 발생해서는 안 됩니다. 이 시점에서 프로세스는 잘못된 상태에 있습니다. 즉, 커널이 메모리 액세스 작업을 수행할 수 없습니다. 시스템 상태도 좋지 않으며 근본 원인에 따라 복구가 가능할 수도 있고 불가능할 수도 있습니다.
"ffffea020f767740에서 커널 페이징 요청을 처리할 수 없습니다"라는 로그 메시지는 프로세스가 액세스하려고 하는 주소를 나타냅니다. 이것은핵심페이징 요청, 커널 코드가 페이지 오류를 처리할 때 발생하는 오류입니다. 이 주소는 커널 주소 범위 내에 있습니다. 나는 문제를 파악하기 위해 Linux 커널 오류 추적을 분석하는 데 능숙하지 않습니다. 프로세스에 필요한 데이터를 읽는 데 필요한 일부 데이터 구조에 대한 메모리가 커널에 부족할 수 있습니다. 이것이 문제가 되지 않으면 사용 중인 커널 버전에 알려진 버그가 있는지 확인하십시오.
답변2
그냥 추측일 뿐입니다. 하지만 이 시스템의 NUMA 노드 0에 메모리가 있습니까? 그렇지 않은 경우 버그가 발생했을 수 있습니다. page_cgroup이 해당 메모리 위치에 할당되지 않은 것 같습니다.
커널 매개변수 "cgroup_disable=memory"를 사용하면 이 오류를 해결할 수 있습니다.