Por que meu PC está congelando enquanto copio um arquivo para um pendrive?

61

Eu tenho uma situação realmente estranha aqui. Meu PC funciona bem, pelo menos na maioria dos casos, mas há uma coisa com a qual não consigo lidar. Quando tento copiar um arquivo do meu pendrive, tudo está bem - eu tenho 16-19M / s, funciona muito bem. Mas quando tento copiar algo para o mesmo pendrive, meu PC congela. O ponteiro do mouse para de se mover por um segundo ou dois, depois se move um pouco e para novamente. Quando algo está tocando, por exemplo, no Amarok, o som age como uma metralhadora. A velocidade salta de 500K / sa 15M / s, em média 8M / s. Isso ocorre apenas quando estou copiando algo para um pendrive. Quando o processo de cópia é concluído, tudo volta ao normal.

Eu tentei de tudo - outro pendrive, uma porta USB diferente no painel frontal ou as portas de trás, até mudei os pinos USB na placa-mãe (painel frontal), mas não importa onde eu coloquei meu pendrive, é sempre o mesmo. Tentei sistema de arquivos diferente - fat32, ext4. Não tenho nenhum problema com o dispositivo no Windows, no meu laptop. Tem que ser o meu PC ou algo no meu sistema. Não tenho ideia do que procurar. Estou usando o teste Debian com o Openbox autônomo. Meu PC é meio antigo - Pentium D 3GHz, 1GiB de RAM, disco WD Green de 1,5TB. Se você tem algo que me ajudaria a resolver esse problema, ficaria feliz em ouvir isso.

Não sei que outras informações devo fornecer, mas se você precisar de algo, basta perguntar, atualizarei esta postagem o mais rápido possível.

Eu tentei reproduzir este problema no ubuntu 13.04 live cd. Montei minha partição criptografada + troca criptografada e conectei meu pendrive a uma porta USB. Em seguida, tentei iniciar alguns aplicativos e agora tenho ~ 820MiB na RAM e cerca de 400MiB no SWAP. Não há problema em copiar, nem congelar, tudo está como deveria ser. Então, parece que é uma falha do sistema, mas onde exatamente? O que causaria um comportamento tão estranho?

Mikhail Morfikov
fonte
Quando encontrei algo semelhante a isso, era porque eu tinha problemas com o disco rígido no meu laptop. O disco tinha algumas áreas ruins e toda vez que eu tentava ler qualquer coisa dessas áreas, ele congelava até terminar. Apenas uma ideia para analisar. Talvez você tenha setores defeituosos dos quais está tentando ler.
slybloty
Meu disco rígido está ok, pelo menos inteligente, diga-o (após a verificação completa).
Mikhail Morfikov
Tente reduzir a prioridade de E / S do processo de cópia, por exemplo ionice -c3 cp something.tgz /media/pendrive. Isso colocará o cpprocesso recém-gerado na terceira classe de prioridade (= mais baixa) "inativa".
n.st
Eu tentei isso, mas não tem efeito.
Mikhail Morfikov
@MikhailMorfikov FYI, esse problema foi solucionado no linux 4.9. Ainda não testei a correção sozinho. YMMV.
Seamus Connor

Respostas:

85

Você está usando uma versão de 64 bits do Linux com muita memória? Nesse caso, o problema pode ser que o Linux possa travar por minutos em grandes gravações em dispositivos lentos, como, por exemplo, cartões SD ou pen drives. É um bug conhecido que deve ser corrigido nos kernels mais recentes.

Veja http://lwn.net/Articles/572911/

Solução alternativa: como problema raiz:

echo $((16*1024*1024)) > /proc/sys/vm/dirty_background_bytes
echo $((48*1024*1024)) > /proc/sys/vm/dirty_bytes

Eu o adicionei ao meu /etc/rc.localarquivo em minhas máquinas de 64 bits.

TANSTAAFL ; essa alteração pode (e provavelmente reduzirá) sua taxa de transferência para esses dispositivos - é um compromisso entre latência e velocidade. Para voltar ao comportamento anterior, você pode

echo 0 > /proc/sys/vm/dirty_background_bytes
echo 0 > /proc/sys/vm/dirty_bytes

... quais são os valores padrão, o que significa que o comportamento de write-back será controlado pelos parâmetros dirty_ratioe dirty_background_ratio.

Nota para o pessoal não tão especialista com linux: os arquivos /proc são pseudofiles --- apenas canais de comunicação entre o kernel e o espaço do usuário. Nunca use um editor para alterar ou olhar para eles; obtenha um prompt de shell --- por exemplo, com sudo -i(sabores do Ubuntu) ou su rootuse echoe cat).

Atualização 2016/04/18 parece que, afinal, o problema ainda está aqui. Você pode vê-lo no LWN.net , neste artigo sobre filas de write-back .

Rmano
fonte
3
Tenho 64 bits, mas apenas 1GiB de RAM, e tenho que lhe dizer que esta solução funciona! Acabei de testar e, depois de definir os dois parâmetros, não há mais congelamento. :)
Mikhail Morfikov
11
Na minha instalação 14.04, uname -aretorna 3.13.0-32-generic, então sim. Mas não verifiquei se o patch para o problema foi finalmente integrado no kernel ou não. Eu tenho uma máquina de 16 GB e parece funcionar bem sem a solução alternativa, embora eu tenha que dizer que não tentei com dispositivos especialmente lentos.
Rmano 7/08/14
11
@ IonicăBizău --- esse é um pseudo-arquivo, não o edite vim sempre . Obtenha um shell raiz (com sudo -i) e use os comandos mencionados acima.
Rmano
11
@Rmano Funcionou! No entanto, eu o editei com o VIM. Obrigado!
Jonică Bizău 5/10/14
2
Estou usando o ubuntu 16.04 em um laptop novo (com 16 GB de RAM). Eu estava realmente bravo com esta questão. Sua solução funcionou como um encanto! Talvez você possa adicionar que isso ainda pode ser necessário com o kernel 4.8.0-45.
LGenzelis
3

O motivo pode ser a amplificação de gravação, pois o sistema tenta gravar em blocos menores do que apagar o bloco (executando leitura / modificação / gravação) + desalinhamento do bloco.

Para verificar sua configuração atual, faça:

cat /sys/block/sd**X**/device/max_sectors

Você pode ajustar as regras do salão para esses dispositivos:

Altere o valor de "max_sectors" USB para uma família inteira de dispositivos

Nesse caso, substituímos max_sectors para todos os dispositivos, que usavam o padrão 240 (armazenamento USB) para setores de 32K ou 2K.

No meu sistema (Mageia 4, 3.14.24 core i7), eu tive que fazer isso devido a velocidades de gravação terrivelmente lentas (2 MB / s) na Kingston DT101 G2 16GB:

vi /usr/lib/udev/rules.d/81-udisks_maxsect.rules

e adicione:

SUBSYSTEMS=="scsi", ATTR{max_sectors}=="240", ATTR{max_sectors}="32678"

E a ddvelocidade de gravação aumentou 3x vezes. mc cpprovavelmente 10-20x (depois que eu iniciei a primeira partição no setor 8192'th e reformatei com clusters alinhados de 64k):

fdisk -u /dev/sdh # make DOS compat off if on
mkfs.vfat /dev/sdh1 -n KINGSTON16G -s 128 **-R 4592*** and use *fsck.vfat -v /dev/sdh1

para verificar o alinhamento (marque [setor de início de dados] deve ser múltiplo de 128 (tamanho do cluster)). Ajuste o número de setores reservados (-R), se necessário.

O max_sectors padrão (240) parece causar alta amplificação de gravação em algumas das novas unidades baratas. Mas tenha muito cuidado com essa configuração alta, o efeito semelhante é alcançado em 2048 setores (provavelmente 1 milhão de blocos de apagamento:

SUBSYSTEMS=="scsi", ATTR{max_sectors}=="240", ATTR{max_sectors}="2048"

Teste todos os seus antigos dispositivos USB, para que eles ainda funcionem bem. Use atributos de fornecedor / modelo nos arquivos de regras para ser mais específico.

Marca
fonte
1

hardware x software

Eu encontrei um problema estranho semelhante a este com os pendrives USB e, na minha pesquisa, quase sempre é um problema de driver ou o hardware específico do PC / Placa-Mãe.

Eu sei disso porque tenho vários sistemas que são hardware idêntico e, em um, posso fazer essa operação sem problemas, enquanto em outro o problema aparece.

O que fazer?

Suas opções são realmente limitadas aqui. As únicas coisas que você pode fazer são garantir que você tenha o BIOS / firmware mais recente instalado no sistema e as versões mais recentes dos pacotes deste.

Além disso, tudo o que posso sugerir é garantir que você evite essa situação, não tentando copiar arquivos enquanto outra cópia estiver em andamento.

Se você tem o tipo de personalidade em que coisas como essa o incomodam, tente outra distribuição ao vivo do Linux e repita as etapas que levam ao seu problema. Isso eliminaria apenas se é um problema específico da distribuição ou um problema de hardware, como descrevi acima. Seria um pequeno consolo, mas eu sempre gosto de saber as coisas, em vez de enterrar a cabeça na areia, e não.

Algo mais?

Se você é realmente obsessivo, tente executar o aplicativo com o qual está fazendo a cópia, stracena esperança de capturar o sistema em qualquer chamada que esteja congelando. Você deve conseguir fazer isso também na linha de comando.

Exemplo

$ strace -o cp1.log cp -r /path/to/dir1 /path/to/usb/. 

Então, enquanto estiver executando, inicie outro.

$ strace -o cp2.log cp -r /path/to/dir2 /path/to/usb/. 

Espera-se que o sistema congele durante esta operação e talvez você tenha sorte e encontre fumaça nesses arquivos de log.

slm
fonte
Eu sempre uso a única instância de cópia de arquivo. Eu tenho o BIOS atualizado (2008) e não há uma versão mais nova desde então. Eu acho que não é o BIOS. Minha distribuição debian também é atualizada para o ramo de testes. Eu tentei usar stracee ele estrelou congelando quase instantaneamente, então esperei alguns segundos e acabei com o processo. Tenho log de 1Mb, mas não consigo lê-lo, não sei o que procurar. Você pode verificar aqui pastebin.com/u29RvqgC - não é o log completo (limitado a 500 KB), mas havia apenas linhas semelhantes às do final. Vou tentar reproduzir esse problema com o ubuntu live cd.
Mikhail Morfikov
Eu atualizei a pergunta sobre o teste de cd ao vivo.
Mikhail Morfikov
@MikhailMorfikov - Eu acho que você está praticamente no final do que pode esperar fazer. Seu hardware é bastante antigo (2008) e não há muito mais que você possa fazer além do que descrevi acima.
slm
Mas mesmo os computadores mais antigos conseguem copiar arquivos sem problemas.
Mikhail Morfikov
@MikhailMorfikov - A idade não é o único fator, mas a probabilidade de obter atualizações de firmware ou atualizações de software para hardware antigo é baixa, foi o que eu quis dizer.
slm