Melhorando o Multipath do SAS para o Desempenho JBOD no Linux

10

Estou tentando otimizar uma configuração de armazenamento em alguns hardwares da Sun com Linux. Qualquer pensamento seria muito apreciado.

Temos o seguinte hardware:

  • Sun Blade X6270
  • 2 * controladores SAS LSISAS1068E
  • 2 * JBODs Sun J4400 com discos de 1 TB (24 discos por JBOD)
  • Fedora Core 12
  • 2.6.33 do kernel do FC13 (também testado com o kernel 2.6.31 mais recente do FC12, os mesmos resultados)

Aqui está a folha de dados para o hardware SAS:

http://www.sun.com/storage/storage_networking/hba/sas/PCIe.pdf

Está usando PCI Express 1.0a, 8x pistas. Com uma largura de banda de 250 MB / s por faixa, poderemos fazer 2000 MB / s por controlador SAS.

Cada controlador pode executar 3 Gb / s por porta e possui dois PHYs de 4 portas. Conectamos os dois PHYs de um controlador a um JBOD. Portanto, entre o JBOD e o controlador, temos 2 PHYs * 4 portas SAS * 3 Gb / s = 24 Gb / s de largura de banda, que é mais do que a largura de banda do PCI Express.

Com o cache de gravação ativado e ao realizar grandes gravações, cada disco pode suportar cerca de 80 MB / s (próximo ao início do disco). Com 24 discos, isso significa que devemos conseguir 1920 MB / s por JBOD.

multipath {
  rr_min_io 100
  uid 0
  multibus path_grouping_policy
  manual de failback
  path_selector "rodízio 0"
  prioridades rr_weight
  alias somealias
  fila no_path_retry
  modo 0644
  gid 0
  wwid somewid
}

Tentei valores de 50, 100, 1000 para rr_min_io, mas não parece fazer muita diferença.

Junto com a variação de rr_min_io, tentei adicionar algum atraso entre iniciar os dd's para impedir que todos escrevessem no mesmo PHY ao mesmo tempo, mas isso não fez nenhuma diferença, por isso acho que as E / Ss estão se espalhando adequadamente.

De acordo com / proc / interrupts, os controladores SAS estão usando um esquema de interrupção "IR-IO-APIC-fasteoi". Por alguma razão, apenas o núcleo nº 0 da máquina está lidando com essas interrupções. Posso melhorar um pouco o desempenho atribuindo um núcleo separado para lidar com as interrupções de cada controlador SAS:

eco 2> / proc / irq / 24 / smp_affinity
eco 4> / proc / irq / 26 / smp_affinity

O uso do dd para gravar no disco gera "Interrupções de chamadas de funções" (não faço ideia do que sejam), que são tratadas pelo núcleo nº 4, portanto, também mantenho outros processos fora desse núcleo.

Eu corro 48 dd (um para cada disco), atribuindo-os a núcleos que não lidam com interrupções da seguinte forma:

conjunto de tarefas -c somecore dd se = / dev / zero de = / dev / mapper / mpathx oflag = direct bs = 128M

oflag = direct impede que qualquer tipo de cache de buffer se envolva.

Nenhum dos meus núcleos parece estar no limite. Os núcleos que lidam com interrupções são inativos e todos os outros núcleos aguardam E / S como seria de esperar.

Cpu0: 0,0% us, 1,0% sy, 0,0% ni, 91,2% id, 7,5% wa, 0,0% hi, 0,2% hi, 0,2% si, 0,0% st
Cpu1: 0,0% us, 0,8% sy, 0,0% ni, 93,0% id, 0,2% wa, 0,0% wa, 0,0% hi, 6,0% si, 0,0% st
Cpu2: 0,0% us, 0,6% sy, 0,0% ni, 94,4% id, 0,1% wa, 0,0% hi, 0,0% hi, 4,8% si, 0,0% st
Cpu3: 0,0% us, 7,5% sy, 0,0% ni, 36,3% id, 56,1% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu4: 0,0% us, 1,3% sy, 0,0% ni, 85,7% id, 4,9% wa, 0,0% hi, 0,0% hi, 8,1% si, 0,0% st
Cpu5: 0,1% us, 5,5% sy, 0,0% ni, 36,2% id, 58,3% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu6: 0,0% us, 5,0% sy, 0,0% ni, 36,3% id, 58,7% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu7: 0,0% us, 5,1% sy, 0,0% ni, 36,3% id, 58,5% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu8: 0,1% us, 8,3% sy, 0,0% ni, 27,2% id, 64,4% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu9: 0,1% us, 7,9% sy, 0,0% ni, 36,2% id, 55,8% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu10: 0,0% us, 7,8% sy, 0,0% ni, 36,2% id, 56,0% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu11: 0,0% us, 7,3% sy, 0,0% ni, 36,3% id, 56,4% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu12: 0,0% us, 5,6% sy, 0,0% ni, 33,1% id, 61,2% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu13: 0,1% us, 5,3% sy, 0,0% ni, 36,1% id, 58,5% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu14: 0,0% us, 4,9% sy, 0,0% ni, 36,4% id, 58,7% wa, 0,0% hi, 0,0% si, 0,0% st
Cpu15: 0,1% us, 5,4% sy, 0,0% ni, 36,5% id, 58,1% wa, 0,0% hi, 0,0% si, 0,0% st

Dado tudo isso, a taxa de transferência relatada executando "dstat 10" está no intervalo de 2200-2300 MB / s.

Dada a matemática acima, eu esperaria algo na faixa de 2 * 1920 ~ = 3600+ MB / s.

Alguém tem alguma idéia de onde foi minha largura de banda perdida?

Obrigado!


fonte
O cache dos controladores LSI SAS está definido como Write-Through? (o write-back será mais lento para grandes cargas de trabalho sequenciais). Também pode querer testar com um bs menor para dd, como bs = 1M.
Brian

Respostas:

1

Boa pergunta, bem preparada :)

Eu sou um homem de velocidade e alimento, e acho que você está disposto a ser honesto. Eu meio que esperava ver sua taxa de transferência menor do que é, mas o que eu acho que você conseguiu é um aumento nas ineficiências menores e esperadas. Por exemplo, é muito difícil para um barramento PCIe chegar a 100% o tempo todo, é melhor assumir uma taxa geral baixa de 90%. Dada a instabilidade que isso causará, também significará que os PHYs não serão 100% 'alimentados' o tempo todo, para que você perca um pouco de espaço, o mesmo para o cache, discos, interrupções não relacionadas a carvão, programação de E / S etc. Basicamente ineficiência menor vezes vezes ineficiência menor ... e assim por diante, acaba sendo mais do que as ineficiências esperadas de 5 a 10% por conta própria. Eu já vi esse tipo de coisa com servidores HP DL conversando com suas caixas MSA SAS usando W2K3 e depois sendo NLB ' em várias NICs - frustrante, mas compreensível, eu acho. Esse é o meu 2c de qualquer maneira, desculpe, não é muito positivo.

Chopper3
fonte