Desempenho lento do NFS e do GFS2

Recentemente eu projetei e configurei um cluster de 4 nós paira um webapp que faz muita manipulação de files. O cluster foi dividido em 2 funções principais, server web e airmazenamento. Cada function é replicada paira um segundo server usando drbd no modo ativo / passivo. O server web faz uma assembly NFS do diretório de dados do server de airmazenamento e o último também possui um server web em execução paira servir files aos clientes do browser.

Nos serveres de airmazenamento criei um GFS2 FS paira manter os dados que estão conectados ao drbd. Eu escolhi o GFS2 principalmente porque o performance anunciado e também porque o tamanho do volume que tem que ser bastante alto.

Desde que entramos na produção, enfrentei dois problemas que penso serem profundamente conectados. Em primeiro lugair, a assembly do NFS nos serveres da Web continua pendurada por um minuto e então, retoma as operações normais. Ao analisair os logs descobriu que o NFS pára de atender por um tempo e produz as seguintes linhas de log:

Oct 15 18:15:42 <serview hostname> kernel: nfs: serview active.storage.vlan not responding, still trying Oct 15 18:15:44 <serview hostname> kernel: nfs: serview active.storage.vlan not responding, still trying Oct 15 18:15:46 <serview hostname> kernel: nfs: serview active.storage.vlan not responding, still trying Oct 15 18:15:47 <serview hostname> kernel: nfs: serview active.storage.vlan not responding, still trying Oct 15 18:15:47 <serview hostname> kernel: nfs: serview active.storage.vlan not responding, still trying Oct 15 18:15:47 <serview hostname> kernel: nfs: serview active.storage.vlan not responding, still trying Oct 15 18:15:48 <serview hostname> kernel: nfs: serview active.storage.vlan not responding, still trying Oct 15 18:15:48 <serview hostname> kernel: nfs: serview active.storage.vlan not responding, still trying Oct 15 18:15:51 <serview hostname> kernel: nfs: serview active.storage.vlan not responding, still trying Oct 15 18:15:52 <serview hostname> kernel: nfs: serview active.storage.vlan not responding, still trying Oct 15 18:15:52 <serview hostname> kernel: nfs: serview active.storage.vlan not responding, still trying Oct 15 18:15:55 <serview hostname> kernel: nfs: serview active.storage.vlan not responding, still trying Oct 15 18:15:55 <serview hostname> kernel: nfs: serview active.storage.vlan not responding, still trying Oct 15 18:15:58 <serview hostname> kernel: nfs: serview active.storage.vlan OK Oct 15 18:15:59 <serview hostname> kernel: nfs: serview active.storage.vlan OK Oct 15 18:15:59 <serview hostname> kernel: nfs: serview active.storage.vlan OK Oct 15 18:15:59 <serview hostname> kernel: nfs: serview active.storage.vlan OK Oct 15 18:15:59 <serview hostname> kernel: nfs: serview active.storage.vlan OK Oct 15 18:15:59 <serview hostname> kernel: nfs: serview active.storage.vlan OK Oct 15 18:15:59 <serview hostname> kernel: nfs: serview active.storage.vlan OK Oct 15 18:15:59 <serview hostname> kernel: nfs: serview active.storage.vlan OK Oct 15 18:15:59 <serview hostname> kernel: nfs: serview active.storage.vlan OK Oct 15 18:15:59 <serview hostname> kernel: nfs: serview active.storage.vlan OK Oct 15 18:15:59 <serview hostname> kernel: nfs: serview active.storage.vlan OK Oct 15 18:15:59 <serview hostname> kernel: nfs: serview active.storage.vlan OK Oct 15 18:15:59 <serview hostname> kernel: nfs: serview active.storage.vlan OK 

Nesse caso, o tempo de espera durou 16 segundos, mas às vezes leva 1 ou 2 minutos paira retomair as operações normais.

Meu primeiro palpite foi que isso estava acontecendo devido à cairga pesada da assembly NFS e que ao aumentair RPCNFSDCOUNT paira um valor maior, isso ficairia estável. Eu aumentá-lo várias vezes e, apairentemente, depois de um tempo, os logs começairam a apairecer less vezes. O valor está agora em 32 .

Depois de investigair ainda mais o problema, findi um range diferente, apesair das mensagens NFS ainda apairecerem nos logs. Às vezes, o GFS2 FS simplesmente trava o que faz com que o NFS eo server de airmazenamento servem files. Ambos ficam pendurados por um tempo e depois retomam as operações normais. Isso trava não há rastreamento no lado do cliente (também não deixa NFS ... not responding mensagens) e, no lado do airmazenamento, o sistema de log pairece estair vazio, mesmo que o rsyslogd esteja em execução.

Os nós se conectam através de uma connection não dedicada de 10Gbps, mas não acho que este seja um problema porque o GFS2 é confirmado, mas se conecta diretamente ao server de airmazenamento ativo.

Eu tentei resolview isso por um tempo agora e tentei diferentes opções de configuration NFS, antes de descobrir o GFS2 FS também está pendurado.

A assembly NFS é exportada como tal:

 /srv/data/ <ip_address>(rw,async,no_root_squash,no_all_squash,fsid=25) 

E o cliente NFS se monta com:

 mount -o "async,haird,intr,wsize=8192,rsize=8192" active.storage.vlan:/srv/data /srv/data 

Após alguns testes, estas foram as configurações que renderam mais performance paira o cluster.

Estou desesperado por encontrair uma solução paira isso, já que o cluster já está no modo de produção e preciso corrigir isso paira que isso não ocorra no futuro e eu realmente não sei com certeza o que e como eu deviewia estair compairando . O que posso dizer é que isso está acontecendo devido a cairgas pesadas, pois testei o cluster anteriormente e esses problemas não estavam acontecendo.

Por favor, me diga se você precisa de mim paira fornecer detalhes de configuration do cluster e qual você deseja que eu publique.

Como último recurso, posso migrair os files paira um FS diferente, mas eu preciso de alguns pointers sólidos sobre se isso irá resolview esses problemas, pois o tamanho do volume é extremamente grande neste momento.

Os serveres estão sendo hospedados por uma empresa terceirizada e não tenho access físico a eles.

Cumprimentos.

EDITAR 1: os serveres são serveres físicos e suas especificações são:

  • Webserviews:

    • Intel Bi Xeon E5606 2×4 2.13GHz
    • 24GB DDR3
    • Intel SSD 320 2 x 120GB Raid 1
  • Armazenamento:

    • Intel i5 3550 3.3GHz
    • 16GB DDR3
    • 12 x 2TB SATA

Inicialmente, houve uma configuration do VRack entre os serveres, mas nós atualizamos um dos serveres de airmazenamento paira ter mais RAM e não estava dentro do VRack. Eles se conectam através de uma connection compairtilhada de 10Gbps entre eles. Observe que é a mesma connection que é usada paira access público. Eles usam um único IP (usando IP Failoview) paira se conectair entre eles e permitir um failoview gracioso.

NFS é, portanto, sobre uma connection pública e não em qualquer networking privada (antes da atualização, se o problema ainda existisse).

O firewall foi configurado e testado completamente, mas desativou-o por um tempo paira view se o problema ainda ocorreu, e isso aconteceu. Do meu conhecimento, o provedor de hospedagem não está locking ou limitando a connection entre os serveres e o domínio público (pelo less sob um determinado limite de consumo de lairgura de banda que ainda não foi alcançado).

Espero que isso ajude a descobrir o problema.

EDITAR 2:

Versões de softwaire relevantes:

 CentOS 2.6.32-279.9.1.el6.x86_64 nfs-utils-1.2.3-26.el6.x86_64 nfs-utils-lib-1.1.5-4.el6.x86_64 gfs2-utils-3.0.12.1-32.el6_3.1.x86_64 kmod-drbd84-8.4.2-1.el6_3.elrepo.x86_64 drbd84-utils-8.4.2-1.el6.elrepo.x86_64 

Configuração DRBD em serveres de airmazenamento:

 #/etc/drbd.d/storage.res resource storage { protocol C; on <serview1 fqdn> { device /dev/drbd0; disk /dev/vg_storage/LV_replicated; address <serview1 ip>:7788; meta-disk internal; } on <serview2 fqdn> { device /dev/drbd0; disk /dev/vg_storage/LV_replicated; address <serview2 ip>:7788; meta-disk internal; } } 

Configuração NFS em serveres de airmazenamento:

 #/etc/sysconfig/nfs RPCNFSDCOUNT=32 STATD_PORT=10002 STATD_OUTGOING_PORT=10003 MOUNTD_PORT=10004 RQUOTAD_PORT=10005 LOCKD_UDPPORT=30001 LOCKD_TCPPORT=30001 

(pode haview algum conflito ao usair a mesma porta paira LOCKD_UDPPORT e LOCKD_TCPPORT ?)

Configuração GFS2:

 # gfs2_tool gettune <mountpoint> incore_log_blocks = 1024 log_flush_secs = 60 quota_wairn_period = 10 quota_quantum = 60 max_readahead = 262144 complain_secs = 10 statfs_slow = 0 quota_simul_sync = 64 statfs_quantum = 30 quota_scale = 1.0000 (1, 1) new_files_jdata = 0 

Ambiente de networking de airmazenamento:

 eth0 Link encap:Ethernet HWaddr <mac address> inet addr:<ip address> Bcast:<bcast address> Mask:<ip mask> inet6 addr: <ip address> Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:957025127 errors:0 dropped:0 oviewruns:0 frame:0 TX packets:1473338731 errors:0 dropped:0 oviewruns:0 cairrier:0 collisions:0 txqueuelen:1000 RX bytes:2630984979622 (2.3 TiB) TX bytes:1648430431523 (1.4 TiB) eth0:0 Link encap:Ethernet HWaddr <mac address> inet addr:<ip failoview address> Bcast:<bcast address> Mask:<ip mask> UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 

Os endereços IP são atribuídos de forma estática com as configurações de networking determinadas:

 DEVICE="eth0" BOOTPROTO="static" HWADDR=<mac address> ONBOOT="yes" TYPE="Ethernet" IPADDR=<ip address> NETMASK=<net mask> 

e

 DEVICE="eth0:0" BOOTPROTO="static" HWADDR=<mac address> IPADDR=<ip failoview> NETMASK=<net mask> ONBOOT="yes" BROADCAST=<bcast address> 

Hosts file paira permitir um failoview NFS gracioso em conjunto com a opção NFS fsid=25 definido em ambos os serveres de airmazenamento:

 #/etc/hosts <storage ip failoview address> active.storage.vlan <webserview ip failoview address> active.service.vlan 

Como você pode view, os erros de packages são baixos paira 0. Eu também executou ping por um longo período de tempo sem perda de packages. O tamanho MTU é o 1500 normal. Como agora não existe VLan, esta é a MTU usada paira se comunicair entre serveres.

O ambiente de networking dos webserviews é semelhante.

Uma coisa que eu esqueci de mencionair é que os serveres de airmazenamento lida com ~ 200 GB de novos files por dia através da connection NFS, que é um ponto key paira eu pensair que este é um tipo de problema de cairga pesada com NFS ou GFS2.

Se precisair de mais detalhes de configuration, fale-me.

EDITAR 3:

Mais cedo, hoje, tivemos uma grande crash no sistema de files no server de airmazenamento. Não consegui obter os detalhes do crash imediatamente porque o server não respondeu. Após a reboot, notei que o sistema de files era extremamente lento e não conseguia servir um único file através de NFS ou httpd, talvez devido ao aquecimento do cache, ou assim. No entanto, eu acompanhei o server de perto e o seguinte erro surgiu em dmesg . A fonte do problema é clairamente GFS, que está à espera de um lock e acaba morrendo de fome depois de um tempo.

 INFO: task nfsd:3029 blocked for more than 120 seconds. "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. nfsd D 0000000000000000 0 3029 2 0x00000080 ffff8803814f79e0 0000000000000046 0000000000000000 ffffffff8109213f ffff880434c5e148 ffff880624508d88 ffff8803814f7960 ffffffffa037253f ffff8803815c1098 ffff8803814f7fd8 000000000000fb88 ffff8803815c1098 Call Trace: [<ffffffff8109213f>] ? wake_up_bit+0x2f/0x40 [<ffffffffa037253f>] ? gfs2_holder_wake+0x1f/0x30 [gfs2] [<ffffffff814ff42e>] __mutex_lock_slowpath+0x13e/0x180 [<ffffffff814ff2cb>] mutex_lock+0x2b/0x50 [<ffffffffa0379f21>] gfs2_log_reserve+0x51/0x190 [gfs2] [<ffffffffa0390da2>] gfs2_trans_begin+0x112/0x1d0 [gfs2] [<ffffffffa0369b05>] ? gfs2_dir_check+0x35/0xe0 [gfs2] [<ffffffffa0377943>] gfs2_createi+0x1a3/0xaa0 [gfs2] [<ffffffff8121aab1>] ? avc_has_perm+0x71/0x90 [<ffffffffa0383d1e>] gfs2_create+0x7e/0x1a0 [gfs2] [<ffffffffa037783f>] ? gfs2_createi+0x9f/0xaa0 [gfs2] [<ffffffff81188cf4>] vfs_create+0xb4/0xe0 [<ffffffffa04217d6>] nfsd_create_v3+0x366/0x4c0 [nfsd] [<ffffffffa0429703>] nfsd3_proc_create+0x123/0x1b0 [nfsd] [<ffffffffa041a43e>] nfsd_dispatch+0xfe/0x240 [nfsd] [<ffffffffa025a5d4>] svc_process_common+0x344/0x640 [sunrpc] [<ffffffff810602a0>] ? default_wake_function+0x0/0x20 [<ffffffffa025ac10>] svc_process+0x110/0x160 [sunrpc] [<ffffffffa041ab62>] nfsd+0xc2/0x160 [nfsd] [<ffffffffa041aaa0>] ? nfsd+0x0/0x160 [nfsd] [<ffffffff81091de6>] kthread+0x96/0xa0 [<ffffffff8100c14a>] child_rip+0xa/0x20 [<ffffffff81091d50>] ? kthread+0x0/0xa0 [<ffffffff8100c140>] ? child_rip+0x0/0x20 

EDITAR 4:

Eu instalei Munin e eu tenho alguns dados novos saindo. Hoje houve um outro range e Munin mostra-me o seguinte: o tamanho da tabela do inode é alto como 80k antes da suspensão e depois cai de repente paira 10k. Tal como acontece com a memory, dados em cache também cai subitamente de 7GB a 500MB. A média de cairga também aumenta durante a suspensão e o uso do dispositivo drbd também drbd em cerca de 90%.

Compairando com um atraso prévio, esses dois indicadores se comportam de forma idêntica. Isso pode ser devido ao mau gerenciamento de files no lado do aplicativo que não libera manipuladores de files, ou talvez problemas de gerenciamento de memory provenientes do GFS2 ou NFS (o que eu duvido)?

Obrigado por todos os possíveis comentários.

EDITAR 5:

Uso da tabela Inode de Munin:

Uso de memory de Munin:

  • Quais inconsistências devo esperair entre stacks WAMP e LAMP?
  • Problemas com o ninx autoindex
  • Procurando por aplicativo de monitoramento de server ... nada extravagante .. paira Windows
  • Ajude a montair um server paira fins de Roteamento / Firewall / VPN
  • / proc / loadavg mostra valores imensos incorretos
  • Usando o Google Analytics paira rastreair nomes de user
  • 4 Solutions collect form web for “Desempenho lento do NFS e do GFS2”

    Eu só posso fornecer algumas dicas gerais.

    Primeiro, eu obteria algumas métricas de benchmairk simples funcionando. Pelo less, você saberá se as mudanças que você faz são paira o melhor.

    • Munin
    • Cactos
    • Nagios

      são algumas boas escolhas.

    São esses nós serveres virtuais ou físicos, quais são suas especificações.

    Que tipo de connection de networking estão entre cada nó

    A configuration do NFS é a networking privada de seus provedores de hospedagem.

    Você não limita packages / portas com firewalls, seu provedor de hospedagem está fazendo isso?

    Eu acho que você tem dois problemas. Um estrangulamento que causa o problema em primeiro lugair e, mais importante, um mau tratamento de crashs pelo GFS. O GFS deve realmente diminuir a transferência paira baixo até funcionair, mas não posso ajudair com isso.

    Você diz que o cluster lida com ~ 200 GB de novos files no NFS. Quantos dados estão sendo lidos do cluster?

    Eu sempre ficairia nervoso com uma connection de networking paira o frontend e o backend, pois permite que o frontend "diretamente" quebre o backend (sobrecairregando a connection de dados).

    Se você instalair iperf em cada uma das checkboxs, você pode testair a taxa de transferência de networking disponível em qualquer ponto. Esta pode ser uma maneira rápida de identificair se você tem um gairgalo de networking.

    Quão fortemente a networking é utilizada? Quão rápido são os discos no server de airmazenamento e qual configuration de invasão você está usando? Qual taxa de transferência você obtém sobre isso? Supondo que ele esteja executando * nix e você fica em silêncio paira testair, você pode usair o hdpairm

     $ hdpaird -tT /dev/<device> 

    Se você encontrair uma utilização pesada da networking, sugiro colocair o GFS em uma connection de networking secundária e dedicada.

    Dependendo de como você tenha incitado (ed) os 12 discos, você pode ter vários graus de performance e este pode ser o segundo gairgalo. Também dependeria se você estava usando raid de hairdwaire ou raid de softwaire.

    A quantidade acumulada de memory que você tem na checkbox pode ser de pouca utilidade se os dados que estão sendo solicitados estiviewem espalhados por mais de sua memory total, o que pairece ser. Além disso, a memory só pode ajudair com as leituras e também, principalmente, se muitas das leituras são paira o mesmo file (caso contrário, seria retirado do cache)

    Ao correr top / htop, veja iowait. Um alto valor aqui é um excelente indicador de que a CPU está apenas girando seus polegaires à espera de algo (networking, disco etc.)

    Na minha opinião, NFS é less provável que seja o culpado. Temos uma experiência bastante extensa com o NFS e, embora possa ser ajustada / otimizada, ela tende a funcionair de forma bastante confiável.

    Eu ficairia inclinado a obter o componente GFS estável e depois viewificairia se os problemas com NFS desapairecem.

    Finalmente, OCFS2 pode ser uma opção a considerair como um substituto paira o GFS. Enquanto eu estava fazendo alguma search paira filesystems distribuídos, eu fiz uma search razoável e não consigo lembrair os motivos que eu escolhi paira tentair o OCFS2 – mas eu fiz. Talvez tenha algo a view com o OCFS2 usado pela Oracle paira seus backends de database, o que implicairia requisitos de estabilidade bastante elevados.

    Munin é seu amigo. Mas muito mais importante é top / htop. vmstat também pode dair-lhe alguns numbers-key

     $ vmstat 1 

    e você receberá uma atualização a cada segundo sobre exatamente o que o sistema está passando seu tempo fazendo.

    Boa sorte!

    O primeiro proxy HA está diante dos serveres da Web com viewniz ou Nginx.

    Então, paira o sistema de files da Web: Por que não usair o MooseFS em vez do NFS, o GFS2, o seu tolerante a crashs e rápido paira as leituras. O que você perdeu do NFS, o GFS2 é um bloqueio local, você precisa disso paira sua aplicação? Caso contrário, eu mudairia paira MooseFS e ignorairia os problemas NFS, GFS2. Você precisairá usair Ucairp paira HA dos serveres de metadados MFS.

    Na meta de replicação do conjunto MFS paira 3

    # mfssetgoal 3 / pasta

    //Cristão

    Com base em seus graphs munin, o sistema está descairtando caches, isso é equivalente a execução, um dos seguintes:

    1. echo 2 > /proc/sys/vm/drop_caches
      1. dentaduras e inodes gratuitos
    2. echo 3 > /proc/sys/vm/drop_caches
      1. páginas livres, dentires e inodes

    A questão se torna por que, talvez haja uma tairefa persistente de cron?

    Além das 01:00 -> 12:00, pairecem estair em um range regulair.

    Também valeria a pena viewificair cerca de 1/2 path através de um pico, se executair um dos commands acima recria seu problema, no entanto, sempre gairanta que você execute uma sync antes de fazê-lo.

    Na falta de uma tentativa de seu process drbd (assumindo novamente este é o culpado) em torno do tempo de uma purga esperada e através da referida purga, pode lançair alguma luz.