« 2006年07月 | メイン | 2006年09月 »

2006年08月27日

Squidのcache_dirの最適化

かなり古いMLが元なので今も有効かよくわからないのですが、
RE: [SQU] Squid cache_dir size calculation from Wisnu Wijayanta on 2000-10-09 (squid-users)
によると、

1)cache_dirのサイズはHDD(パーティション)のサイズの60%以下に
Squidのwikiの方にも記述がありますが、swap.stateファイルや一時ファイルの容量、そしてfilesystemのフラグメンテーションを考えて、少なめにしておく方がよいそうです。


2)最適なL1ディクレクリ数
cache_dirのサブディレクトリ数は、以下の式で求めます。

(((cache-size-KB/avg.-KB)/L2)/L2)*2= L1 dir.

L2はデフォルト256になっており、変更は必要なさそうです。


かなりのCache Object数を抱えるサーバ(2.5 STABLE14)において、上記の設定を試しています。
結果として、HDDの容量の9割ぐらいをcache_dirに割り当てた時に起きていた、Cache Hitのrespose timeがCache Missの場合を大きく上回るようになり、全体のパフォーマンスが落ちることが押さえられているので、まだまだこの最適化は効果ありそうです。

あと、reiserfsとmount時のnoatime,notailは確実に効果あります。

2006年08月20日

Path::Classでnew_absみたいな

ファイルシステムだから、単純にはいかないのだけれども、URIのnew_absの様なものが欲しい時がある。
Path::Classなら、両方ファイルだとして、

my $abs = Path::Class::file( Path::Class::file($base)->dir, $path );

ってやればできる。

File::Specなら

my $abs = File::Spec->rel2abs( $path, $base );

むしろこっちの方が単純だったか。。

↓上を利用してYAMLで外部ファイルをinclude

use YAML;
use Path::Class;

sub LoadFile {
    my $file  = shift;
    &_loadfile({}, $file );
}

sub _loadfile {
    my $args = shift;

    my $file = Path::Class::file( @_ );
    my $hashref = YAML::LoadFile($file);

    if ( $hashref->{include} ) {
        die "'include' must be array or scallar"
          if ( ref $hashref->{include} && ref $hashref->{include} eq "HASH");
        $hashref->{include} = [ $hashref->{include} ]
          unless ref $hashref->{include};
        my %include_hash;
        foreach my $include ( @{ delete $hashref->{include} } ) {
            my $include_hash = &_loadfile( $args, $file->dir, $include );
            %include_hash = ( %include_hash, %$include_hash );
        }
        $hashref = { %include_hash, %$hashref };
    }

    return $hashref;
}