任务单 #29792

DropbearでSCPが動作しない

开放日期: 2012-10-09 11:07 最后更新: 2012-10-15 09:18

报告人:
(del#24082)
属主:
(del#24082)
类型:
状态:
关闭
组件:
优先:
5 - Medium
严重性:
5 - Medium
处理结果:
文件:
Vote
Score: 0
No votes
0.0% (0/0)
0.0% (0/0)

Details

Dropbear 2012.55(SSHサーバ)に対して、32KBを超えるファイルがSCP送信できない。

任务单历史 (3/16 Histories)

2012-10-09 11:07 Updated by: (del#24082)
  • New Ticket "DropbearでSCPが動作しない" created
2012-10-09 11:09 Updated by: (del#24082)
评论

ssh_scp_thread スレッドで、バッファサイズ(32KB)よりリモートウィンドウサイズ(c->remote_window)が いつまでも小さいままなので、ファイル送信できていなかった。

buflen = 8192*4;       ↓ buflen = min(c->remote_window, 8192*4);

という修正でOKそう。

2012-10-09 12:05 Updated by: (del#1144)
评论

こちらでも確認しました。大丈夫そうですね。

2012-10-09 12:11 Updated by: (del#1144)
评论

送信が開始されないことはなくなったようですが、送信途中で

} while (ret > c->remote_window);

のループが終わらないことがあるようです。

2012-10-09 19:35 Updated by: (del#24082)
评论

maya への返信

送信が開始されないことはなくなったようですが、送信途中で {{{ } while (ret > c->remote_window); }}} のループが終わらないことがあるようです。

そのときの c->remote_window の値はいくつでしたでしょうか? 最初の 32KMB が大きすぎるのかもしれません。

2012-10-09 21:41 Updated by: (del#1144)
评论
c->remote_window = 24514

で始まって、止まったところでは

ret = 24514
c->remote_window = 16430
となっています。

ちなみに、6,920,986 バイトのファイルの 6,520,724 バイトで止まっています。

2012-10-10 12:49 Updated by: (del#24082)
评论
	buflen = 8192*4;
       ↓
	buflen = 8192*2;

上記のように、ssh_scp_thread()において、初期バッファサイズを半分にしたら、 9MB程度のファイル転送に成功しました。 この処置ではいかがでしょうか?

2012-10-10 14:12 Updated by: (del#1144)
评论

いまはbuflenの調整が最初の1回だけですが、c->remote_windowにあわせてbufのほうを増減するのは難しいでしょうか。

今回は16KB前後がしきい値になっているようですが、16KBより小さいところから上に回復しない場合には同様の現象が起こりそうです。また、余裕があるときにbufが増えれば転送レートが改善されるような気がするのですが、どうでしょう。

2012-10-10 19:53 Updated by: (del#24082)
评论

送信しようとしているデータが、リモートウィンドウサイズ(c->remote_window)よりはみ出している場合、 はみ出した分は遅延送信するしくみにしていることを思い出しました。 下記のdoループ自体、削除してしまってもよいような気がしますが、その結果どうなるでしょうか?

		do {
			// socket or channelがクローズされたらスレッドを終わる
			if (pvar->socket == INVALID_SOCKET || c->scp.state == SCP_CLOSING || c->used == 0)
				goto abort;

			if (ret > c->remote_window) {
				Sleep(100);
			}

		} while (ret > c->remote_window);

2012-10-11 21:33 Updated by: (del#1144)
评论
  • SCP のプログレスバーがすごい速さで進む
  • 100% まで行って SCP ダイアログが閉じる
  • ls してみると、ファイルサイズがどんどん増える(転送が終わってない)
  • 最後まで転送が終わらず、ファイルサイズが増えるのが止まる

という動きになりました。

2012-10-11 23:55 Updated by: (del#24082)
评论

それではダメですね。 doループは残しつつ、無限ループに陥らなければよいので、doループの中でカウンタを 設け、上限を超えたらループを抜けるようなしくみにするのはどうでしょうか?

        count = 0;
	do {
			// socket or channelがクローズされたらスレッドを終わる
			if (pvar->socket == INVALID_SOCKET || c->scp.state == SCP_CLOSING || c->used == 0)
				goto abort;

			if (ret > c->remote_window) {
				Sleep(100);
			}
                        count++;
                        if (count > 100)
                            break;
		} while (ret > c->remote_window);
2012-10-12 12:33 Updated by: (del#1144)
评论

こんなふうにするのはどうでしょうか。

		// ファイルから読み込んだデータはかならずサーバへ送信する。
		readlen = max(4096, min(buflen, c->remote_window));
		ret = fread(buf, 1, readlen, c->scp.localfp);
		if (ret == 0)
			break;

		// remote_window が回復するまで待つ
		do {
			// socket or channelがクローズされたらスレッドを終わる
			if (pvar->socket == INVALID_SOCKET || c->scp.state == SCP_CLOSING || c->used == 0)
				goto abort;

			if (ret > c->remote_window) {
				Sleep(100);
			}

			// 10秒抜けられなかったら抜けてしまう
			count++;
			if (count > 100) {
				break;
			}

		} while (ret > c->remote_window);

2012-10-13 00:11 Updated by: (del#24082)
评论

なるほど、それはよさそうですね。 SCPのスループットは下がってないでしょうか?

2012-10-13 22:35 Updated by: (del#1144)
评论

手元での計測では、openssh では 10% くらい、dropdear では 100% くらいスループットが上がりました。

2012-10-13 22:48 Updated by: (del#24082)
评论

maya への返信

手元での計測では、openssh では 10% くらい、dropdear では 100% くらいスループットが上がりました。

了解しました。 お手数ですが、修正のコミットをお願いできますでしょうか?

2012-10-15 09:18 Updated by: (del#24082)
  • Ticket Close date is changed to 2012-10-15 09:18
  • 状态 Update from 开启 to 关闭
评论

最先端で修正確認が取れましたので、本件はクローズとします。 ご協力どうもありがとうございました。>mayaさん

Attachment File List

No attachments

编辑

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » 登录名