QNAPのiSCSIバイスが不安定になった、その対応

QNAPのiSCSIを使ってLinuxからストレージをマウントしている。この機能はとても素晴らしいが、今回少し難しい障害が発生した。

QNAPでは4TBのHDD2枚をRAID1構成にして、ストレージプールを作り、全領域をiSCSIのひとつのLUNにしている。これをlinuxからSCSIバイスとしてマウントしてる。1TBのSSDをキャッシュに設定している。

Linux側でこのデバイスI/Oエラーが発生した。QNAPのstrage managerでは一見HDDに問題が見られない。とりあえず、linuxとQNAPを再起動したものの、問題は解決せず。

QNAPのインターフェースをポチポチしていると、strage manager-> Disks/VJOBOD -> ストレージを選択肢し、Disk health -> Test と進んでいくことで、S.M.A.R.Tを使ったテストができることがわかり、RAID1に使っているHDD2枚それぞれテストしてみると、一枚に問題が見つかったのでホットスワップで交換した。

次の日RAID1の再構成が終わったのを確認してiSCSIバイスをマウントしてみたものの、再度障害が発生。ただなんとなく障害の度合いが少しマシ。例えば、昨日は一度障害が発生するとiscsiadmでLUNを切り離したあと、再度LUNにつなごうとしてもつながらなかったが、今日は同様の作業をしてみたらLUNにつながる。とりあえずQNAPとlinuxを両方再起動してみたものの、問題は解決せず。

もう、さらにできそうなことは、SSDキャッシュをやめることくらいなので、SSDをQNAPから外し、QNAPとlinuxを再起動。その結果、障害が発生しなくなった。ただ、問題が本当にSSDにあったのかというと、なんとなく違う気がする。いずれにせよ、SSDキャッシュを必要とするほどのデータアクセスはないので、要らないものは付けないに限るということでSSDなしで運用を続けることにする。

まとめ。

QNAPで障害が発生した。QNAPのストレージテストで、HDDが故障していることが確認できた。HDDを交換するものの障害が完全には治らず。最終的にSSDキャッシュを外すことで障害が治った。QNAPは異常に大きな負荷をかけない限り安定しているし、知らなかった便利な機能がビジュアルで見つかったのはありがたかった。

Fortranバイナリデータを書いて、CとPython(numpy)で読む

Ubuntu-14.04 64bit上のgcc-4.8.4でテスト。

test.F90

program test
  implicit none

  integer :: i, j, count
  real(kind=8) :: data(4, 3)

  print '("Number of bits used for data:", i5)', storage_size(data)
  
  count = 1
  do i = 1, 4
     do j = 1, 3
        data(i, j) = count
        write(*, '(F15.8)', advance='no') data(i, j)
        count = count + 1
     end do
     print *, ''
  end do
  open(unit=11, file="data.bin", status="REPLACE", access="STREAM")
  write(11) data
  close(unit=11)

end program test
% gfortran test.F90
% ./a.out
Number of bits used for data:   64
     1.00000000     2.00000000     3.00000000
     4.00000000     5.00000000     6.00000000
     7.00000000     8.00000000     9.00000000
    10.00000000    11.00000000    12.00000000

test.c

#include<stdio.h>

int main(void) {
  FILE *fp;
  int i, j;
  double x;
  
  printf("Number of bits used for data: %d\n", (int)(sizeof(double) * 8));

  fp = fopen("data.bin", "rb");
  if (!fp) {
    printf("File open failed.\n");
    return 1;
  }

  for (j = 0; j < 3; j++) {
    for (i = 0; i < 4; i++) {
      fread(&x, sizeof(double), 1, fp);
      printf("%f ", x);
    }
    printf("\n");
  }

  return 0;
}
% gcc test.c
% ./a.out
Number of bits used for data: 64
1.000000 4.000000 7.000000 10.000000
2.000000 5.000000 8.000000 11.000000
3.000000 6.000000 9.000000 12.000000

test.py

#!/usr/bin/python

import numpy as np

shape = (3, 4)
dt = np.dtype(('double', shape))
print("Number data type is %s." % dt)
data = np.fromfile("data.bin", dtype=dt)[0]
print(data)
% ./test.py
Number data type is ('<f8', (3, 4)).
[[  1.   4.   7.  10.]
 [  2.   5.   8.  11.]
 [  3.   6.   9.  12.]]