1分で試せるディスクI/Oチェック

うーむ、ディスクのエイジング的なことがしたいと思って、思いつく限りで1分でかけそうなエイジングスクリプトを書いてみた。
動けばいい適当スクリプトなので、スコープとかその辺はあえて適当で。

これ、意味あるのか・・・・
とりあえず、loadavgはかなり上がるな。

#!/usr/bin/perl

$a = 1;
$b = 1000;

print "test start!\n";

while ($a != $b) {
    print "create 100M file: $a\/$b\n";
    `dd if=/dev/zero of=$a bs=1M count=100`;
    $a++;
}

$a = 1;

while ($a != $b) {
    print "delete: $a\/$b\n";
    `rm -f $a`;
    $a++;
}

print "test finish!\n";

実行するとこんな感じ。

・・・・
create 100M file: 808/1000
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 4.6236 seconds, 22.7 MB/s
create 100M file: 809/1000
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.70688 seconds, 148 MB/s
create 100M file: 810/1000
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.544506 seconds, 193 MB/s
create 100M file: 811/1000
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.553215 seconds, 190 MB/s
create 100M file: 812/1000
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.985928 seconds, 106 MB/s
create 100M file: 813/1000
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 4.80139 seconds, 21.8 MB/s
create 100M file: 814/1000
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 3.33673 seconds, 31.4 MB/s
create 100M file: 815/1000
・・・・

topとかはこんな感じ。

top - 22:35:01 up  8:21, 12 users,  load average: 12.66, 11.31, 9.02
Tasks: 107 total,   2 running, 105 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.7%us,  9.9%sy,  0.0%ni,  0.0%id, 87.4%wa,  0.3%hi,  1.7%si,  0.0%st
Mem:   2059384k total,  2010732k used,    48652k free,     8552k buffers
Swap:        0k total,        0k used,        0k free,  1635688k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
14937 root      18   0  4892 1572 1500 D  2.3  0.1   0:00.07 dd
 5924 root      10  -5     0    0    0 D  1.3  0.0   0:24.13 kjournald

vmstatはこんな感じ。
やばいやばい、むしろCPUのエイジングみたいになってる。
まぁ、気にしない。

# vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1 11      0  52596   8668 1635680    0    0 18755 22377  558  599  3 20 34 43  0
 1 11      0  53084   8468 1635028    0    0    12 43928 1148  316  0 53  0 47  0
 1 11      0  52740   8476 1634096    0    0     8 46112 1166  395  1 51  0 48  0
 0 13      0  49024   8432 1635148    0    0     8 69484 1179  275  0 35  0 65  0
 0 13      0  48976   8388 1635080    0    0     0 67948 1133  184  0 10  0 90  0
 0 13      0  48952   8404 1635332    0    0     4 48124 1124  186  0  8  0 92  0
 0 12      0  53596   8420 1631152    0    0     0 63332 1119  177  0  8  0 92  0
 0 13      0  48856   8388 1636116    0    0     4 55344 1138  287  0 10  0 90  0
 0 13      0  49124   8424 1636172    0    0    16 48652 1120  159  0  5  0 95  0
 0 13      0  49144   8456 1636292    0    0     0 65400 1123  174  1 14  0 85  0
 0 13      0  48912   8472 1636480    0    0     0 48112 1127  193  0  7  0 93  0
 0 12      0  53660   8472 1632072    0    0     0 65548 1130  172  0  4  0 96  0
 0 12      0  52984   8432 1633632    0    0     0 54284 1112  169  1  9  0 90  0
 1  9      0  51792   8432 1635556    0    0     8 27924 1129  370  0 34  0 66  0

ふむふむ、やはりloadavgの上昇はディスクのI/Owaitに大きく依存しているように見える。

perlでforkするメモ

perlでforkする実験を色々してみた。
結構色々分かったのでメモ。

  • 親が子を作って、プログラムをコピーして渡して実行する
  • 親が子を作った時のグローバル変数はそのままコピー?ループカウント変数は保持したまま。
  • 子が最初からプログラムを純粋に実行するわけではない?
#!/usr/bin/perl

use strict;
use warnings;

$| = 1;

# 並行して生むことが出来る子の数
my $child_max = 3;
my $child_num = 0;

# 処理は30回
my $roop_max = 30;
my $roop_count = 0;

my ($pid, $wait_pid, $sleep_time);

while ($roop_count != $roop_max) {
    $pid = fork;
    # 親が子を生むときは子のPIDを返す
    # 子がforkするときは0を返す
    # 失敗したら未定義値を返す
    if ($pid ne 0) {
        # 親の処理
        $child_num++;
        print "roop[$roop_count] fork child: ]
            all_child_num[$child_num] child_pid[$pid]\n";
    } elsif (defined $pid) {
        # 子の処理
        $sleep_time = rand 10;
        print "roop[$roop_count] start child process task:
            all_child_num[$child_num] task[sleep $sleep_time]\n";
        sleep $sleep_time;
        exit 0;
    } else {
        exit 1;
    }

    # 親の子プロセス数管理
    if ($child_num == $child_max) {
        print "roop[$roop_count] start  wait child process: 
            all_child_num[$child_num]\n";
        $wait_pid = wait;
        $child_num--;
        print "roop[$roop_count] finish wait child process:
            all_child_num[$child_num] exit_child_pid[$wait_pid]\n";
    }

    $roop_count++;
}

# 子プロセスが全て終わるのを待つ
# wait()はどれかの子プロセスを待つ
# waitする子プロセスが無ければ-1を返す
while ($wait_pid ne "-1") {
    $wait_pid = wait;
    print "roop[$roop_count] wait all child process:
         all_child_num[$child_num] exit_child_pid[$wait_pid]\n";
}

Doverからみる32と606のラスト考察

Edward Greenといえば、やはりDover。
個人的に最も好きなのもDover。

DoverはDoverでも、ラストによって全然雰囲気を変えてしまうのが、Edward Greenの魅力でもありすごいところでもある。

今回は、Green至上最も細身のラストと呼ばれている32と、202をほんのりとスクエアトゥにした606のラストの外見を比較してみた。

続きを読む

Dover E606 Dark Oak Antique

円高が進んだせいで、予定外の買い物をしてしまった(言い訳)。

しかし、予定外以上に満足いくものだった。
英国本国のエドワードグリーンとメールでやりとりして、かなり格安で手に入れることができた。

購入した靴は、DoverのE606である。

続きを読む

簡易バックアップスクリプト

簡単に作ってみた。

#!/usr/bin/perl

use warnings;
use strict;

my $retval = "1";
my $master_dev = "/dev/sda1";
my $backup_dev = "/dev/hdc";
my $backup_dev1 = "/dev/hdc1";
my $master_dir = "/";
my $backup_dir = "/backup";
my $log = "/var/log/backup.log";


print "backup $master_dir ($master_dev) -> $backup_dir ($backup_dev1)\n";

my $mount_chk = `mount | grep $backup_dir | grep $backup_dev1`;
chomp($mount_chk);
print "mount_check: ";

if ($mount_chk ne "") {
    print "OK\n";

    print "tune2fs: ";
    $retval = system("tune2fs -c -1 -i 0 $master_dev > $log 2>&1");

    if ($retval eq "0") {
        $retval = system("tune2fs -c -1 -i 0 $backup_dev1 >> $log 2>&1");

        if ($retval eq "0") {
            print "OK\n";
        } else {
            print "NG\n";
            exit(1);
        }
    } else {
        print "NG\n";
        exit(1);
    }

    sleep 3;

    print "rsync: ";
    $retval = system("rsync -avx --delete $master_dir $backup_dir/ >> $log 2>&1");

    if ($retval eq "0") {
        print "OK\n";
    } else {
        print "NG\n";
        exit(1);
    }

    print "grub-install: ";
    $retval = system("grub-install --root-directory=$backup_dir $backup_dev >> $log 2>&1");

    if ($retval eq "0") {
        print "OK\n";
    } else {
        print "NG\n";
        exit(1);
    }

} else {
    print "NG\n";
    exit(1);
}

そろそろバックアップをした方が良い年になってきた。
昔は、DISK壊れても、1から作り直せる程度のものが多かったが、今は無理!
これでしばらくは大丈夫かな。

実行後

# ./backup.pl
backup / (/dev/sda1) -> /backup (/dev/hdc1)
mount_check: OK
tune2fs: OK
rsync: OK
grub-install: OK