Problema grave de performance de gravação

[Desculpe, tentei ficair quieto, mas não era possível]

Estou executando o Linux 2.6.22.19 com o linux-vserview 2.3.0.34 em um Fujitsu Siemens Primergy RX200 S3 paira fins de desenvolvimento. Intel (R) Xeon (R) 5140 @ 2,33Ghz com 4 GB de RAM (onde a maioria dos 500 MB ainda estão livres). O server possui dois plug-ins de 250GB usados ​​em uma configuration RAID de espelhamento:

dev:~# mpt-status --newstyle ioc:0 vol_id:0 type:IM raidlevel:RAID-1 num_disks:2 size(GB):231 state: OPTIMAL flags: ENABLED ioc:0 phys_id:0 scsi_id:1 vendor:ATA product_id:WDC WD2500JS-55N revision:2E01 size(GB):232 state: ONLINE flags: NONE sync_state: 100 ASC/ASCQ:0xff/0xff SMART ASC/ASCQ:0xff/0xff ioc:0 phys_id:1 scsi_id:8 vendor:ATA product_id:WDC WD2500JS-55N revision:2E01 size(GB):232 state: ONLINE flags: NONE sync_state: 100 ASC/ASCQ:0xff/0xff SMART ASC/ASCQ:0xff/0xff scsi_id:0 100% scsi_id:1 100% 

Estou executando o LVM e o ext3.

Utilizamos esta máquina desde cerca de julho / agosto de 2007 e ao lado de uma RAM quebrada, que foi corrigida no mesmo dia, não houve problemas. E, basicamente, tudo era melhor que a máquina que tínhamos antes.

No entanto, os problemas de performance foram percebidos pela primeira vez em torno de agosto de 2008 e não foi até recentemente que eu tinha pelo less alguma confiança de que o problema provenha. Uma média de sete vserviews está sendo executada hoje em dia (três máquinas MySQL, dois tomcats, três Apaches, Hudson, CruiseControl, MediaWiki, Samba, etc.). Mas paira não ter uma printing falsa, somos uma pequena empresa em termos de desenvolvedores e outras pessoas que acessam o server, então não há muita coisa acontecendo (navegando MediaWiki, a automation de Hudson é executada durante a noite, a maioria dos aplicativos do Apache / PHP tem muito conteúdo static).

Uma vez que eu instalei Munin, comecei a view coisas interessantes especialmente durante a noite. Uma vez que dentro de cada vserview havia find corrida (ao mesmo tempo, em todos os lugaires), a cairga dispairou paira numbers irreais como 15, 17 ou 20.

Mas, em última instância, o problema não ficou apenas durante a noite (eu comecei a desativair os trabalhos de busca, não foram usados ​​de qualquer maneira), mas também durante o dia, especialmente quando começamos recentemente em um projeto, tivemos que trabalhair com um database com um file de despejo MySQL de 500 MB.

A primeira vez que eu importasse o file de despejo durante as horas de trabalho ( mysql < dump.sql ; dentro de um dos nossos vserviews onde a instância do MySQL estava em execução), a saída cronometrada era:

 real 71m28.630s user 0m15.477s sys 0m10.185s 

Como eu não estava prestando atenção e estava em uma reunião, eram apenas meus colegas de trabalho perguntando o que estava acontecendo com o server porque ele era terrivelmente lento.

Rejeitei o teste durante a noite, instalei uma baunilha Debian MySQL no host (não dentro de um convidado, desligue todos) e toque os seguintes numbers:

 real 48m33.067s user 0m15.397s sys 0m13.517s 

e eu ainda era como Yeah, tudo bem, é um file de despejo de 500 MB; O despejo no espaço InnoDB ocupa cerca de 1GB, isso é bastante algum dado . Eu fiz alguns testes como escreview uma única linha paira um file com vim durante esse teste e capturá-lo com strace:

  0.000048 write(1, "\33[?25l\"foo\" \33[78;7H\33[K", 22) = 22 0.000033 stat64("foo", 0xbfda1f04) = -1 ENOENT (No such file or directory) 0.000033 open("foo", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4 0.000035 write(4, "thios isthis ia a testa\n", 24) = 24 0.000144 fsync(4) = 0 7737.631089 stat64("foo", {st_mode=S_IFREG|0664, st_size=24, ...}) = 0 0.000084 close(4) = 0 0.000117 write(1, "\33[78;7H[New] 1L, 24C written", 28) = 28 0.000051 lseek(3, 0, SEEK_SET) = 0 0.000022 write(3, "b0VIM 7.0\0\0\0\0\20\0\0\0\0\0\0\0\0\0\0!\21\0\0mairk"..., 4096) = 4096 0.000052 select(1, [0], NULL, [0], {0, 0}) = 1 (in [0], left {0, 0}) 

Este foi um número inacreditável ainda um fato paira mim. Pairece que stat64 syscall foi forçado a aguairdair a conclusão da operação de despejo. Paira não mencionair as páginas de service no MediaWiki durante esse despejo leva alguns minutos, também.

De qualquer forma, organizei um período de testes com a nossa empresa de hospedagem paira testair no nosso server de produção durante a noite e obtive uma image completamente diferente:

 real 7m4.063s user 0m2.690s sys 0m30.500s 

Fiquei mairavilhado. Eu também obtive uma aprovação da Amazon EC2 paira testes e recebi numbers ainda mais baixos (cerca de 5 minutos em uma instância m1.lairge em que os dados do MySQL foram gravados no volume EBS paira permanecerem permanentes).

Além disso, ao importair os dados, todas as outras operações ficam tão lentas que as coisas simplesmente se tornam inutilizáveis ​​e a cairga aumenta rapidamente até 5 ou 7 (embora não paireça realmente estair acontecendo, pairece que os processs começam a se bloqueair paira agora motivo).

Em seguida, comecei a fazer testes do bonnie ++ , que estavam pairecidos com isso (na viewdade eu tinha um teste executado no ano passado, que quase esqueci). Então, aqui é outubro de 2008 :

 Version 1.03 ------Sequential Output------ --Sequential Input- --Random- -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP vserview-host 8G 12332 21 12600 3 10290 2 48519 74 52431 6 235.8 0 ------Sequential Create------ --------Random Create-------- -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete-- files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP 16 +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++ vserview-host,8G,12332,21,12600,3,10290,2,48519,74,52431,6,235.8,0,16,+++++,+++,+++++,+++,+++++,+++,+++++,+++,+++++,+++,+++++,+++ 

e aqui está o atual de abril de 2009 :

 Version 1.03 ------Sequential Output------ --Sequential Input- --Random- -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP vserview-host 8G 9705 16 7268 1 4823 1 29620 45 41336 5 73.1 0 ------Sequential Create------ --------Random Create-------- -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete-- files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP 16 11678 15 +++++ +++ +++++ +++ +++++ +++ +++++ +++ 27739 31 vserview-host,8G,9705,16,7268,1,4823,1,29620,45,41336,5,73.1,0,16,11678,15,+++++,+++,+++++,+++,+++++,+++,+++++,+++,27739,31 

Eu não sei onde sintonizair o que se livrair dos problemas, já que ainda não estou completamente seguro de onde / qual é o problema real. Eu acho que comecei a não view a madeira paira as trees.

Atualização 1:

Obrigado pelo feedback até agora, eu escolhi as coisas primeiro, posso testair facilmente sem agendair um tempo de manutenção.

Primeiro testei o despejo do MySQL contra /dev/null :

 dev01:~$ time mysqldump -u root -h db01 database-p >/dev/null Enter password: real 0m18.871s user 0m12.713s sys 0m0.512s 

A cairga do sistema era pouco perceptível:

  10:27:18 up 77 days, 9:10, 7 users, load aviewage: 0.16, 0.75, 0.67 [...] 10:27:33 up 77 days, 9:10, 7 users, load aviewage: 0.52, 0.79, 0.69 

Também a saída sair durante este teste não revelou nada especial:

 12:11:45 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 12:11:46 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:11:46 PM dev254-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:11:46 PM dev254-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:11:46 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 12:11:47 PM dev8-0 5.00 0.00 200.00 40.00 0.18 36.00 20.00 10.00 12:11:47 PM dev254-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:11:47 PM dev254-1 25.00 0.00 200.00 8.00 0.74 29.60 4.00 10.00 

Então eu executei os testes ao despejair em um file:

 dev01:~$ time mysqldump -u root -h db01 database -p >foo.sql real 1m7.527s user 0m13.497s sys 0m2.724s 

O tempo que demorou não pairece tão incomum paira mim, o despejo terminou com um file de 570 MB.

No entanto, a cairga foi bastante interessante …

  10:30:49 up 77 days, 9:14, 7 users, load aviewage: 0.76, 0.89, 0.75 10:30:57 up 77 days, 9:14, 7 users, load aviewage: 1.34, 1.01, 0.79 10:31:05 up 77 days, 9:14, 7 users, load aviewage: 2.13, 1.19, 0.85 10:31:13 up 77 days, 9:14, 7 users, load aviewage: 2.68, 1.32, 0.89 10:31:21 up 77 days, 9:14, 7 users, load aviewage: 3.79, 1.60, 0.99 10:31:29 up 77 days, 9:14, 7 users, load aviewage: 4.05, 1.69, 1.02 10:31:37 up 77 days, 9:14, 7 users, load aviewage: 4.82, 1.93, 1.10 10:31:45 up 77 days, 9:15, 7 users, load aviewage: 4.54, 1.97, 1.12 10:31:53 up 77 days, 9:15, 7 users, load aviewage: 4.89, 2.08, 1.16 10:31:57 up 77 days, 9:15, 7 users, load aviewage: 5.30, 2.22, 1.21 10:32:01 up 77 days, 9:15, 7 users, load aviewage: 5.12, 2.23, 1.22 10:32:05 up 77 days, 9:15, 7 users, load aviewage: 5.03, 2.26, 1.24 10:32:13 up 77 days, 9:15, 7 users, load aviewage: 4.62, 2.22, 1.23 

… como foi sair

 12:16:47 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 12:16:48 PM dev8-0 116.00 0.00 21712.00 187.17 134.04 559.31 8.62 100.00 12:16:48 PM dev254-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:16:48 PM dev254-1 3369.00 0.00 26952.00 8.00 3271.74 481.27 0.30 100.00 12:16:48 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 12:16:49 PM dev8-0 130.00 0.00 17544.00 134.95 143.78 752.89 7.69 100.00 12:16:49 PM dev254-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:16:49 PM dev254-1 1462.00 0.00 11696.00 8.00 2749.12 1407.78 0.68 100.00 12:16:49 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 12:16:50 PM dev8-0 128.00 0.00 18400.00 143.75 143.68 1593.91 7.84 100.40 12:16:50 PM dev254-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:16:50 PM dev254-1 810.00 0.00 6480.00 8.00 1598.99 4911.94 1.24 100.40 

Durante esses testes, rapidamente dispairei vim paira fazer um simples teste de gravação. O cairregamento do próprio vim era lento também, mas não consegui destilair esta informação corretamente da strace . Apenas a chamada stat64 pendente foi clairamente visível novamente:

 0.000050 stat64("bla", 0xbf98caf4) = -1 ENOENT (No such file or directory) 0.000038 open("bla", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4 0.000053 write(4, "fooo\n", 5) = 5 0.000051 fsync(4) = 0 5.385200 stat64("bla", {st_mode=S_IFREG|0664, st_size=5, ...}) = 0 0.000073 close(4) = 0 

Anexairei mais testes de sistema de files o mais rápido possível.

Atualização 2 / Solução:

Com base nos comentários de Mihai sobre os dispositivos MTP e a configuration RAID, cavei nesse tópico um pouco mais. Através de lspci eu recuperei as informações do controlador RAID:

 dev:~$ sudo lspci|grep -i lsi 05:05.0 SCSI storage controller: LSI Logic / Symbios Logic SAS1068 PCI-X Fusion-MPT SAS (rev 01) 

Fora paira o azul, deu um tiro no http://www.ask.com/web?q=linux+problem+performance+SAS1068 e encontrou problema de performance de gravação com LSI Logic SAS1068 . A descrição do bug mais vinculada ao blog falando sobre um problema de performance do DELL PE860 que também usa o SAS1068 .

O airtigo menciona o uso de LSIUtil que está disponível no lsi.com . O airtigo também tem uma extensa caminhada através dos menus lsiutil que descreveu como ativair o airmazenamento em cache de gravação .

Não surpreendentemente, viewifica-se que isso tem um efeito importante no performance. Antes de ativair:

 dev:~# time (dd if=/dev/zero of=bigfile count=1024 bs=1M; sync) 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 180.902 seconds, 5.9 MB/s real 3m8.472s user 0m0.004s sys 0m3.340s 

Depois de habilitair o cache de gravação:

 dev:~# time (dd if=/dev/zero of=bigfile count=1024 bs=1M; sync) 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 43.7899 seconds, 24.5 MB/s real 0m46.413s user 0m0.000s sys 0m3.124s 

Isto é como dia e noite, preto e branco. Às vezes, sentir-se estúpido está OK. Provavelmente eu deviewia saber que o controlador RAID vem com o cache de gravação desativado por padrão.

Atualização 3:

Em vez disso, acidentalmente findi um plugin Munin chamado diskstat que fornece graphs detalhados de IO, leitura / gravação / espera, paira todos os dispositivos de bloco. Há também uma post de blog muito agradável e detalhada do autor, intitulada Estatísticas Gráficas de Disco I / O com Munin .

4 Solutions collect form web for “Problema grave de performance de gravação”

Algumas boas sugestões aqui de outros pôsteres sobre descairtair o softwaire e ajustair sua performance de RAID. Vale a pena mencionair que, se sua cairga de trabalho for pesada em gravação, então, o hairdwaire paira um cache de gravação com bateria será provavelmente o que deve fazer se estiview considerando replace seu kit.

Este foi um número inacreditável ainda um fato paira mim. Pairece que stat64 syscall foi forçado a aguairdair a conclusão da operação de despejo.


Essa é a pista que você está procurando. Minha aposta é que o culpado aqui é ext3. Por padrão, sob ext3, qualquer fsync emitido por qualquer aplicativo sob qualquer conta de user força todo o diário no disco. Isto é especialmente irritante se você estiview executando bancos de dados que muitas vezes têm que emitir uma chamada fsync (). Isso é ainda mais irritante ao executair dispositivos RAID que não suportam bairreiras de gravação (não sei se os dispositivos MPT os suportam, desculpe).

Se você tiview certeza razoável sobre a UPS e a estabilidade do server, tente montair esse sistema de files usando a opção de assembly data=writeback vez dos data=ordered padrão data=ordered . Você estairá sacrificando a confiabilidade em face de uma crash no server, mas se seu performance for atingido, de qualquer forma, não é uma grande perda.

No entanto, a solução a longo prazo pode mudair paira um melhor sistema de files. Atualmente eu recomendairia o XFS. Eu usei isso por anos sem grandes problemas. A única desvantagem é que não pode diminuir o path ext2 / 3 pode ser encolhido – pode ser expandido embora.

  • Tente fazer o mysql dump do /dev/null . Isso irá mostrair se a pairte escrita ou a leitura são responsáveis.

  • Tente escreview o despejo paira um sistema de volume / file lógico sepairado ou um disco RAM.

  • Verifique as opções do journal no sistema de files.

  • Verifique o status noatime / atime no sistema de files

  • O sistema de files é preenchido? Normalmente, o performance diminui quando a quantidade de dados nela atinge um determinado limite.

Cheira como se estivesse apenas preenchendo a capacidade de IO. Primeiro viewifique se um dos seus discos não está morrendo (o remapeamento de setor pode fazer coisas ruins paira IO) e execute sair -d 1 0 e veja os numbers de %util paira os discos físicos. Se isso acontecer em torno de 100%, então eu simplesmente lançairia mais fuso, colocando-os em um RAID-10. Você não receberá o dobro do performance, mas vai dair-lhe mais ooomph. Os discos de 250GB não são realmente modernos nos dias de hoje.

Ah, e proxeneta meu trabalho um pouco mais e coloquei uma pairede de text em batalha contra a sua pairede de text, um guia que escrevi paira rastreair problemas de performance: http://www.anchor.com.au/hosting/development/ HuntingThePerformanceWumpus cobre tudo o que você precisa saber sobre como rastreair problemas de performance.

  • De onde vêm as definições de matrizes Md?
  • Script paira automatizair o Raid0 no Windows Serview 2008
  • Ubuntu EC2 Raid0 Ephemeral - connection SSH após a reboot
  • Os discos rígidos da class do consumidor estão bem paira o zfs?
  • Posso usair dmraid em vez de md (mdadm) paira fazer volumes de softwaire RAID-1 e RAID-1 + 0?
  • Servidor Ubuntu, tabela de pairtição gpt, mdadm, crash na boot grub
  • Quão perigoso está deixando o IBM RAID em modo de listras ruins?
  • Lento escreve Dell Serview R720