Por que minha área de trabalho trava quando copio muitos arquivos para uma unidade USB?

Por que minha área de trabalho trava quando copio muitos arquivos para uma unidade USB?

Minha área de trabalho geralmente responde muito bem, mesmo sob carga pesada. Mas quando copio arquivos para uma unidade USB, ele sempre trava depois de algum tempo. Por "travar", quero dizer:

  • Mover o foco de uma janela para outra pode levar de 10 a 20 segundos
  • A troca de desktops pode levar de 10 a 20 segundos
  • Os vídeos não são mais atualizados (no YouTube, o áudio continua sendo reproduzido, apenas o vídeo congela)

A carga do sistema não é excepcionalmente alta quando isso acontece. Às vezes, vejo muito branco no xosview indicando que o kernel está ocupado em algum lugar.

À primeira vista, parece que copiar arquivos para a unidade USB interferiria de alguma forma no compiz, mas não consigo imaginar qual poderia ser a conexão.

Aqui está a saída de htop:

Saída do htop logo após o travamento

Aqui está o resultado de iostat -c -z -t -x -d 1um travamento de 2 minutos:

19.07.2012 20:38:22
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1,27    0,00    0,38   37,52    0,00   60,84

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdg               0,00     2,00    0,00  216,00     0,00 109248,00  1011,56   247,75  677,69    0,00  677,69   4,63 100,00

Como você pode ver, apenas o disco rígido externo está ativo. Aqui está o registro completo:http://pastebin.com/YNWTAkh4

O hangar começou às 20:38:01 e terminou às 20:40:19.

Informações de software:

  • openSUSE 12.1
  • KDE 4.7.x
  • Sistemas de arquivos: reiserfs e btrfs no meu disco rígido interno, btrfs na unidade USB

Responder1

Meu primeiro palpite foi btrfsque os processos de E/S desse sistema de arquivos às vezes assumem o controle. Mas isso não explicaria por que X trava.

Olhando para as interrupções, vejo o seguinte:

# cat /proc/interrupts 
           CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7       
  0:        179          0          0          0          0          0          0          0  IR-IO-APIC-edge      timer
  1:          6          0          0          0          0          0          0          0  IR-IO-APIC-edge      i8042
  8:          1          0          0          0          0          0          0          0  IR-IO-APIC-edge      rtc0
  9:          0          0          0          0          0          0          0          0  IR-IO-APIC-fasteoi   acpi
 12:         10          0          0          0          0          0          0          0  IR-IO-APIC-edge      i8042
 16:    3306384          0          0          0          0          0          0          0  IR-IO-APIC-fasteoi   ehci_hcd:usb1, nvidia, mei, eth1

Bem, duh. O driver USB usa o mesmo IRQ da placa gráfica e é o primeiro da cadeia. Se travar (porque o sistema de arquivos faz algo caro), a placa gráfica morre de fome (e a rede também).

Responder2

Eu já tinha visto problemas semelhantes comopenSUSEKernel Linux-3.1 do 12.1 e descobri que desabilitar páginas enormes e transparentes ajudou:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

O problema subjacente é que se um aplicativo alocar 4 MB ou mais, o kernel tentará fornecer a ele uma página enorme, para a qual precisará de 4 MB de RAM contíguos. Agora, se houver muitas páginas sujas por aí, que ainda precisam ser gravadas em um dispositivo USB lento, ele espera que esse IO termine antes de continuar com a alocação de memória.

Responder3

Como mencionado, isso provavelmente tem a ver com a configuração do kernel Hugepages. Conheço várias pessoas com esse problema. Você pode encontrar diversas documentações sobre isso na web, por exemplo

Resolvi completamente o problema em minha configuração fazendo o seguinte. Observe YMMV, nem todas as correções abaixo podem ser necessárias e talvez não sejam suficientes. Posso ter esquecido algo para ser honesto. De qualquer forma, essa é a minha configuração e funciona.

  • Use o kernel linux-ck
  • echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
  • echo never > /sys/kernel/mm/transparent_hugepage/defrag

Responder4

Troque o cabo. Remova a oxidação das portas/cabos USB.

informação relacionada