68user's page 掲示板

Prev< No. 4215〜4220> Next  [最新発言に戻る] [過去ログ一覧]
No. 4215 # seki [E-mail] 2005/08/02 (火) 13:30:18
はじめまして、sekiと申します。

ftpに関しまして、分からない事があり質問させて頂きます。
どなたかご存知の方おられましたら、ご教示をお願い致します。

【環境】
・Solaris8
・in.ftpdを使用

【問題】
・バッチ処理にて、バーチャルIPでftpを行い、他ホストに作成された
    ファイルを取得する。
    ネットワーク障害時や他ホストdown時、バーチャルIPが見えなくなる場合、
    ftpのconnect:接続の時間切れとなるが、その場合約4分も待たされる。
    
【知りたい事】
・上記のような障害時、1ノードで約4分も待たされるのは長いので、設定で
    短く出来るのであれば短くしたい。

【検証】
    1 OSパラメータのtcp_time_wait_interval=240000(4分)になっていたので、
     ftpがconnect_timeoutになるのは、上位のTCPのタイマーに引っかかるのでは
         と思い、nddコマンドにて60000(1分)にしてinetdデーモンを、kill -HUPした。
         変更後、バーチャルIPが見えないHostに対しftpを行なったが、以前4分で
         ftp_connect:接続の時間切れとなる。

    2 /etc/inet/inetd.confの、ftp記述部分を下記のように-tオプションにて
         タイムアウトを設定し、inetdデーモンを、kill -HUPした。
         こちらも変更後、バーチャルIPが見えないHostに対しftpを行なったが、
         以前4分でftp_connect:接続の時間切れとなった。

    ftp stream tcp6 nowait root /usr/sbin/in.ftpd in.ftpd -t20 -l -d

※ 下記のURLを参考にさせて頂きましたが、FTPクライアントがFTP サーバに
        PORTコマンドを投げて応答なしで、データ用コネクションも張れない場合は
        どこの設定でクライアントはtimeoutを判断するのでしょうか?
        私の推測のようにTCPに依存するものなのでしょうか?

        http://x68000.q-e-d.net/~68user/net/ftp-1.html

No. 4216 # 68user 2005/08/02 (火) 13:49:52
>>4215 seki
> tcp_time_wait_interval=240000(4分)になっていたので、
tcp_time_wait_intrval は TIME_WAIT な時間を設定するものなので、
関係ありません。
    http://docs.sun.com/app/docs/doc/816-0607/6m735r5ga?a=view

> ftp stream tcp6 nowait root /usr/sbin/in.ftpd in.ftpd -t20 -l -d
タイムアウト設定をしたいのは ftp であり、ftpd ではないので
関係ありません。そもそもネットワーク障害や他ホストが down して
いるのであれば、ftpd まで行き着いていません。

今回設定したいのは、
    http://X68000.q-e-d.net/~68user/net/tcp-connect-1.html
における connect のタイムアウト時間と思われますが、OS の設定で
変更できるかどうかは知りません。ただし、普通は OS の設定は変更
しません。たとえば今後、
    - FTP 接続だけは 10秒でタイムアウトさせたい
    - それ以外のプログラムでは 4分待たせたい
というときにどうしようもなくなるからです。

対策としては、
    - ftp に -T [タイムアウト秒数] オプションを付ける (試していませんが)
    - ftp の前に ping してみる (タイムアウト秒数を指定)
    - 監視用プロセスをたて、一定時間反応がなければ ftp を kill する
てな感じでしょうか。

No. 4218 # seki [E-mail] 2005/08/02 (火) 16:31:10
>>4216 68user
> たとえば今後、
> - FTP 接続だけは 10秒でタイムアウトさせたい
> - それ以外のプログラムでは 4分待たせたい
> というときにどうしようもなくなるからです。

→ 誠に早急なご返答、及びご教示の程、ありがとうございます。
        上記の返答、ごもっともです。
        - ftp に -Tをつけるのは、一つの手だと思いますが、APLに手を
        入れる事なく設定変更で済ませれるのであれば済ませたいです。

        申し訳ございませんが、ftpのソースコードなどは開示されていないので
        しょうか??
        (4分でタイムアウトするという事は必ずどこかを見て判断しているはずですので
         ソースにじか書きしている可能性もある?かと思われるため確認したいです。)

No. 4219 # Netboy 2005/08/02 (火) 18:51:38
>>4218 seki
横からすみません.
ftpのポート21でconnectできるかチェックするPerlスクリプトを
書いてみました.試していただけますか?

use Socket;

$SIG{'ALRM'} = sub { close(SOCK); $sTimeout='(timeout)'; };

# ConnectTest(IPアドレス,ポート,タイムアウト秒数)

if (!&ConnectTest('192.168.x.x',21,5)){
    print "cannot make a ftp connection.\n";
    exit;
}

# 正常ならばftpコマンドを実行
system ('ftp hogehoge');

exit;

sub ConnectTest
{
    local($sIP,$nPort,$nTimeout)=@_;
    local($iaddr,$paddr,$flag,$protoTCP,$sTimeout);

    $iaddr = inet_aton($sIP) || die "no host: $sIP";
    $protoTCP = getprotobyname('tcp');

    $paddr = sockaddr_in($nPort, $iaddr);
    $flag=socket(SOCK, PF_INET, SOCK_STREAM, $protoTCP);

    if (!$flag){ goto J1_1; }

    $flag=0;$sTimeout='';

    eval {
        alarm($nTimeout);
        $flag=connect(SOCK, $paddr);
        alarm(0);
    };

    if (!$flag){ goto J1_1; }
    if ($sTimeout){ goto J1_1; }

    close (SOCK);
    return 1;
J1_1:
    close (SOCK);
    return 0;
}

No. 4220 # 68user 2005/08/02 (火) 21:19:51
>>4218 seki
> ftpのソースコードなどは開示されていないのでしょうか??
Solaris8 のソースは配られていたかどうかは忘れましたが、いずれにせよ
ソース中には 4分という記載はありません (見てませんが)。connect(2) の
タイムアウトを決めるのはカーネルの仕事です。

で、
    http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-3.html#ss3.5
によると、
    # ndd -set /dev/tcp tcp_ip_abort_cinterval 180000
で変更可能なようです。

> APLに手を入れる事なく設定変更で済ませれるのであれば済ませたいです
プログラムに手を入れるよりもカーネルの設定を変える方がよいというのは
間違った判断だと思います。

まぁ客や上司の意向とか、ソース触ったら契約がどうこうとか、世の中には
うっとうしいことがいろいろあるので別にいいですが。

>>4219 Netboy
ウチの環境では動きました。

Prev< No. 4215〜4220> Next  [最新発言に戻る] [過去ログ一覧]