Linux / Multipath não está usando todos os caminhos e não usará path_selector no tamanho da fila?

3

Eu tenho o seguinte hardware:

  • 2 servidores SuperMicro (128 GB de RAM, 2 AMDs de 8 núcleos)
  • 2x / servidor LSI SAS2008 HBAs PCIe MPT-Fusion2 (2 portas SAS por cartão)
  • 1x LSI CTS2600 DAS com unidades SAS 24x W.D. 15.7k RPM de 600 GB.

O servidor está executando o OpenSuSE 11.4, com uma compilação personalizada de ferramentas multipath construídas a partir do upstream e incorporando o conjunto de patch do OpenSuSE 11.3. Todas as 4 portas SAS em cada servidor estão conectadas ao DAS, 2 para cada um dos controladores DAS RAID.

O DAS é configurado com 22 unidades em uma faixa RAID10 de 128k. Eu criei um único grupo de 500 GB no array e o exportei para um dos servidores.

O Multipath é configurado para multipath I / O para o LUN de 500 GB exportado para o servidor. Aqui está o arquivo multipath.conf:

defaults {
    path_checker            "directio"
    path_selector           "queue-length 0"
    path_grouping_policy    "multibus"
    prio                    "random"
    features                "1 queue_if_no_path" #queue IO if all paths are lost
}

multipath -l output:

pg (360080e50001b658a000005104df8c650) dm-0 LSI,INF-01-00
size=500G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 rdac' wp=rw
|-+- policy='round-robin 0' prio=0 status=active
| |- 4:0:0:1 sda 8:0   active undef running
| '- 5:0:0:1 sde 8:64  active undef running
'-+- policy='round-robin 0' prio=0 status=enabled
  |- 4:0:1:1 sdc 8:32  active undef running
  '- 5:0:1:1 sdg 8:96  active undef running

Observe como para o segundo conjunto de caminhos, "status = enabled", não "status = active" como para os dois primeiros. Agora, uma olhada no iostat mostra que, de fato, estamos usando apenas os dois primeiros caminhos:

Linux 2.6.37.6-0.5-default (slipdb01-primary)   07/07/2011      _x86_64_        (16 CPU)                                                       

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util                                      
sda               0.00     0.00    1.18  441.70    30.44  4748.62    21.58     0.79    1.79   0.24  10.60                                      
sdb               0.00     0.00    0.00    0.00     0.00     0.00    14.22     0.00   83.56  82.92   0.00                                      
sdc               0.00     0.00    0.00    0.00     0.00     0.00     8.06     0.00  334.53 331.73   0.02                                      
sdd               0.00     0.00    0.00    0.00     0.00     0.00    16.99     0.00   98.73  95.76   0.00                                      
sde               0.00     0.00    1.18  441.70    30.43  4747.77    21.58     0.79    1.79   0.24  10.60                                      
sdf               0.00     0.00    0.00    0.00     0.00     0.00    14.43     0.00   77.17  76.66   0.00                                      
sdg               0.00     0.00    0.00    0.00     0.00     0.00     8.06     0.00  301.72 297.05   0.02                                      
sdh               0.00     0.00    0.00    0.00     0.00     0.00    14.29     0.00   83.12  82.69   0.00                                      
sdi               0.00     0.00    0.08    0.48     8.73    35.82   159.00     0.06   99.95   1.08   0.06                                      
sdj               0.00  2311.06    0.00  340.49     0.01 10606.18    62.30     0.04    0.12   0.08   2.83                                      
dm-0              0.02  1353.74    2.36  883.40    60.86  9496.39    21.58     0.95    1.08   0.13  11.20                                      
dm-2              0.00     0.00    2.38 2237.14    60.86  9496.39     8.54     1.90    0.84   0.05  11.20

Pelo que entendi, definir path_grouping_policy como 'multibus' deve equilibrar o IO em TODOS os caminhos, portanto, devo ver quatro caminhos ativos. Se eu alterar path_grouping_policy para 'failover', vejo os mesmos 2 caminhos ativos.

Além disso, observe que eu tenho path_selector definido como 'queue-length 0', mas a saída de 'multipath -l' mostra claramente que está usando round-robin.

Alguém tem alguma idéia sobre por que os multipath-tools não usarão todos os 4 caminhos, e por que ele está ignorando a minha escolha do algoritmo de seleção de caminho?

Muito obrigado ...

    
por Kendall 08.07.2011 / 00:38

3 respostas

2

Bem, parece que o array não está ativo / ativo da maneira que eu pensei ... e da maneira que eu achava que era a definição comum. O CTS2600 é um array ativo / ativo da maneira que pode servidor LUN1 do Controlador A e LUN2 do Controlador B, mas não LUN1 do Controlador A, B. Então parece que não consigo obter todos os 4 caminhos indo para um LUN.

No entanto, descobri que posso balancear a carga do IO entre os dois controladores. Fiz isso criando um grupo de volumes RAID10 de 22 unidades no array CTS2600, criando dois volumes e definindo o caminho preferencial para o volume A para o controlador A e o controlador B para o volume B e exportando-os para o servidor. Então eu os inicializei como Volumes Físicos do LVM2 usando os nomes em / dev / mapper /. Em seguida, criei um grupo de volumes LVM2 que continha ambos os volumes físicos. Como tenho dois LUNs, ao fazer o 'lvcreate', adicionei a opção "--stripes 2". Eu então formatei, montei e usei o dispositivo como de costume. Observando o 'iostat' e o SANricity Builtin Performance Monitor, ficou claro que o IO estava sendo distribuído pelos dois contolleres, como esperado.

Obrigado a um cavalheiro gentil do #postgres por me dar a atenção na opção --stripes para fazer isso acontecer (especialmente porque o LSI não queria ou não podia ajudar).

    
por 27.07.2011 / 05:47
1

Além disso, deixei de fora detalhes sobre os bits queue-length e path_selector. O dispositivo de armazenamento que estou usando já está no banco de dados do multipath e, como tal, tem determinados padrões definidos, como queue-length e path_selector. Meu /etc/multipath.conf não tinha uma seção "devices {device {", que é onde você pode substituir as opções padrão. Depois de fazer essa alteração, consegui confirmar que poderia mudar (e o multipath usaria) queue-length e path_selector. A parte que eu adicionei ao /etc/multipath.conf:

   devices {
     device {
     vendor  "LSI"
     product "INF-01-00"
     no_path_retry   fail
     features        0
     #path_grouping_policy   "multibus"
     }
   }

Espero que isso ajude alguém.

    
por 07.09.2011 / 20:02
1

Às vezes, isso é chamado de "Ativo Duplo" e não são verdadeiros engenheiros de SAN ativo / ativo do FC estão acostumados. Os fornecedores poderiam fazer um trabalho melhor ao descrever a limitação de seus produtos baseados em SAS. Este artigo explica todos os modos muito bem.

    
por 30.01.2012 / 20:33