vncviewer -via が遅い理由

Webを見ると SSH tunnel 経由のTightVNCが遅いと書いているものが多いのだが、 たいていは、ポートフォワードした先の localhost::番号 にそのまま繋いじゃっ て、圧縮なしで遅くなっているというのが主な理由。ま、詳しくは TightVNCのページ参照。 普通は vncviewer に -encodings tight (or -e t)をつければちゃんと速くなる。 のだが、もうひとつ -encodings tight をつけていても遅くなる症状を発見。

厳密にいうと、遅くなるというより「ひっかかる」ようになるもので、 vncviewerで繋いだ先の仮想端末でキーリピートをしても スムーズに進まないことがある。これは、vncviewer の -via オプションを 使った場合でこの場合、vncviewer が裏で勝手に ssh -f -L .... と ローカルフォワードをよろしくオプション指定して呼んでくれる。

んが、これだとフォワードされたパケットがひっかかるんだよな。 ちゃんとSSHのソースを見てないので現象論的にしか把握してないけれども、 sshは自分にttyが割り当てられていないときはI/Oをバッファリングするよね? なので、バースト的に流れるパケットはスムーズに行くけど、キー入力の ようなちょろちょろパケットはまとめて送られるから調子悪い。

これを解決するには、ttyを持たせた状態で ssh を起動しなければ だめ。ssh -t でだましてもダメ。てことで、screenの助けを借りよう、

export VNC_VIA_CMD='screen -dmS vnc /usr/bin/ssh -t -L %L:%H:%R %G sleep 20; sleep 1'

screen様に、最初からdetachした状態でsshを起動してもらう。これで sshはちゃんとscreenの魂の中でttyを持って起動するのでもたつきがない。 sshに-tを渡すのも忘れずに。