Estranho processo de estado de D, provavelmente preso no manipulador de falhas de página?

4

Eu tenho um processo de estado D, mas ele não parece estar no meio de qualquer syscall. É um processo intensivo da CPU (tensorflow) e foi interrompido enquanto outro processo intensivo da CPU (bazel) estava sendo executado. Aqui estão algumas informações de diagnóstico (após 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

Também verifiquei que a contagem de comutadores de contexto não aumenta. Não há no uma entrada suspeita no 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 ]---

Curiosamente /proc/4088/tasks tem 4168 a 4183 , exceto 4176

Esse problema pode estar relacionado: link .

Por que isso fica preso? O que posso fazer sobre isso?

    
por Huazuo Gao 05.03.2017 / 15:04

2 respostas

2

O que causa uma falha de página em um processo é um acesso a um local de memória que não está mapeado atualmente na RAM. A menos que o processo esteja executando truques sujos com um manipulador SIGSEGV, há dois motivos pelos quais isso pode acontecer: pode ser um acesso a um endereço que não esteja mapeado no processo; nesse caso, o processo falhará (é um erro) ou pode ser um acesso a um endereço mapeado, mas que não está atualmente na RAM. O último é perfeitamente legítimo: ele pode ser um local em um arquivo mapeado na memória que não está no cache, ou um local na memória alocada que está atualmente sendo trocado.

Uma falha de página significa que o processo causa uma armadilha do processador (essa é a consequência de um acesso a um endereço de memória não mapeado). Uma armadilha invoca o código do kernel e, enquanto este código do kernel está em execução, o processo está no estado D (suspensão ininterrupta).

A falha da página causou um “BUG” no kernel. Um bug é um bug - isso não deveria acontecer. Neste ponto, o processo está em mau estado - o kernel não conseguiu fazer o acesso à memória funcionar. O sistema também está em mau estado e, dependendo da causa raiz, isso pode ou não ser recuperável.

A mensagem de log “incapaz de tratar o pedido de paginação do kernel em ffffea020f767740” indica qual endereço o processo estava tentando acessar. Esta é uma requisição de paginação do kernel , ou seja, o bug aconteceu no código do kernel para lidar com a falha da página. O endereço está no intervalo de endereços do kernel. Eu não sou bom o suficiente para analisar os rastreamentos de erro do kernel Linux para dizer qual é o problema. Pode ser que o kernel tenha ficado sem memória para alguma estrutura de dados necessária para ler os dados de que o processo precisa. Se esse não for o problema, veja se há algum bug conhecido na versão do kernel que você está usando.

    
por 06.03.2017 / 02:15
0

Apenas um tiro no escuro, mas você tem alguma memória no nó NUMA 0 nesse sistema? Se não, há um bug que você pode estar atingindo. Parece que talvez o page_cgroup não tenha sido alocado para esse local de memória.

Usar o parâmetro do kernel "cgroup_disable = memory" pode contornar esse bug.

    
por 21.11.2017 / 20:58