[ruby-list:50890] Re: Net::SSH を使ったパイプ処理
From:
hirura <hirura@...>
Date:
2020-06-02 07:07:31 UTC
List:
ruby-list #50890
ライブラリに詳しいわけではないので間違ってるかもですが、exec のブロックの中は、コールバックの処理だけになるのがライブラリの期待ではないでしょうか。 while ループのために、exec メソッドがサーバー応答を待たずに継続され、本来、一部データ送信、サーバーレスポンス、の繰り返しのはずが、送信してばかりになって、サーバーからのウィンドウサイズ調整のリクエストが処理されていないとか。 on_process(execリクエストや、dataリクエストの完了のサーバー応答のはず)のようなコールバックのなかで、バッファ読み込んで送信、を繰り返す形かなと。 2020年6月2日(火) 9:35 <emo@nifs.ac.jp>: > > On 2020/06/01 22:12, dezawa wrote: > > 解決策では無いのですが、もしかしたらヒントになるかも、と > > > > > 差分データが大きい場合は、send_data ではデータが実際には送られず、 > > > バッファーに溜まって行き、本体のメモリが足らなくなって > > > 失敗しているようです。 > > のではなく、 > > > > つど送っているのだが > >> while (data=sender_out.read(BUF_SIZE)) do > > の data が使い捨てられて、つど新しい領域が確保され、GCが間に合わない > > のでは? > > > > 以下つぶやき > > data に入れずに ちょくに channel.send_data(sender_out.read(BUF_SIZE)) > > してみる方法は領域取り直すのだろうか、、、 > > (そういう手段があるかわかりませんが)既得領域に上書きするようにできない > > だろうか > > 出澤 > > > > どうもご返答ありがとうございます。 > > Net::SSHのソースコードを追ってみたのですが、 > Channel クラスのsend_data というメソッドの中では、実際にデータは送られず、 > Buffer クラスのインスタンス output に追加しているだけのようです。 > > 249 def send_data(data) > 250 raise EOFError, "cannot send data if channel has declared > eof" if eof? > 251 output.append(data.to_s) > 252 end > > > 実際に送られるのは process > メソッドを読んだ際に呼び出される、enqueue_pending_outputというメソッド内です。 > > 484 def enqueue_pending_output #:nodoc: > 485 return unless remote_id > 486 > 487 while output.length > 0 > 488 length = output.length > 489 length = remote_window_size if length > > remote_window_size > 490 length = remote_maximum_packet_size if length > > remote_maximum_packet_size > 491 > 492 if length > 0 > 493 connection.send_message(Buffer.from(:byte, > CHANNEL_DATA, :long, remote_id, :string, output.read(length))) > 494 output.consume! > 495 @remote_window_size -= length > 496 else > 497 break > 498 end > 499 end > 500 end end > > 実際にどういう動きになっているか491行目にprint 文を追加し、length, output.length, > remote_window_sizeの値を表示してみました。 > > > すると、以下のようになり、途中から remote_window_sizeが0になると output > のサイズが増加一方となり、最後にはメモリが尽きてしまうようです。 > この先のプログラムの動作が追えていないのですが、実行中はremote_window_size > は減少するのみで、元に戻ることがありません。 > > > length=32768 output.length=102400 remote_window_size=2097152 > length=32768 output.length=69632 remote_window_size=2064384 > length=32768 output.length=36864 remote_window_size=2031616 > length=4096 output.length=4096 remote_window_size=1998848 > length=32768 output.length=102400 remote_window_size=1994752 > length=32768 output.length=69632 remote_window_size=1961984 > length=32768 output.length=36864 remote_window_size=1929216 > length=4096 output.length=4096 remote_window_size=1896448 > length=32768 output.length=102400 remote_window_size=1892352 > length=32768 output.length=69632 remote_window_size=1859584 > length=32768 output.length=36864 remote_window_size=1826816 > length=4096 output.length=4096 remote_window_size=1794048… > … > … > length=16384 output.length=69632 remote_window_size=16384 > length=0 output.length=53248 remote_window_size=0 > length=0 output.length=155648 remote_window_size=0 > length=0 output.length=258048 remote_window_size=0 > length=0 output.length=360448 remote_window_size=0 > length=0 output.length=462848 remote_window_size=0 > length=0 output.length=565248 remote_window_size=0 > length=0 output.length=667648 remote_window_size=0 > length=0 output.length=770048 remote_window_size=0 > … > … > > > > > 江本 > > >