web-dev-qa-db-ja.com

SSH X11転送はVPN経由で非常に遅い

私はVPN(OpenVPNを使用)を使用して自宅と職場のコンピューター間のアクセスを維持しています。今日、GUIのみのアプリをSSH転送しようとしましたが、これはひどくであることがわかりましたスロー。私は以前にSSH X11転送を使用したことがあり、確かにレイテンシがありますが、この2つのホスト間では本当に大きいです。ボタンをクリックしてから、ローカルマシンに出力が表示されるまでに約20秒かかります。

この2つのホスト間にrtt min/avg/max/mdev = 84.393/86.858/91.297/3.163 msのレイテンシがあり、SSH接続により約1.2MiB/sが得られますthink十分すぎるはずです:\

私は-YCXを使用しており、YC(openvpnはすでにlzoで圧縮されている)を使用した場合と使用しない場合、および異なる暗号を実験的に試しましたが、同様の結果が得られました。

私はそれがGTKテーマかもしれないと考え始めています。それは本当に重いか何かかもしれません。

これが正常であるかどうかを誰かが知っていますか?レイテンシを減らすにはどうすればよいですか? (3-5は我慢できるかもしれませんが、20は多すぎます)

4

転送の問題contemporary X(ネットワークの透過性が発明されたときのthat「古い」Xではない)は、フォントのスムージングに関連しています:適切にスムージングするeach glyph =ある面にレンダリングされたテキストの場合、Xサーバーは、そのグリフをレンダリングしたいクライアントから、そのグリフのバウンディングボックスの下にあるビットマップを取得する必要があります。 (これは、グリフがレンダリングされるコンテキストを考慮に入れるため、スムージングアルゴリズムが適切に機能するために必要です。)

したがって、最新のGUIツールキットを使用すると、Xサーバーとそのクライアントの間でシャベルされるトラフィックの量はhuge:になります。ローカルXサーバーでこれらを有効にすると、TCP通常、これらは-nolisten tcp)で開始され、一部のGTKベースまたはQtベースのXクライアントにTCP経由でサーバーとの通信を強制します。

$ DISPLAY=localhost:x11 /usr/bin/that/x-app

(Xサーバーの標準ポートについては、grep x11 </etc/servicesを参照してください)。 Xトラフィックがローカルホストから出ていなくても、クライアントの動作がいかに遅いかすぐにわかります。これは、通常、Xトラフィックが、基本的にメモリ内のバッファー間でバイトをコピーするだけのUnixドメインソケットを介して伝送されるため、非常に低いためです。オーバーヘッドになり、すべてのキューと複雑なロジックを含む完全なTCP/IPスタックを通過します。ここで、このトラフィックがデータ転送プロトコルの3つのレイヤーにラップされて送信されるとどうなるかを考えてみましょう。VPNによって運ばれるSSHトンネルワイヤーによって運ばれるTCP/IPによって運ばれるSSHトンネル。

これについて何をすべきかについては、私にはよくわかりません。

mosh out of game を指定して、OpenSSHクライアントのIPQoSオプションを試してみます。

別のアプローチは別の角度から問題を攻撃することです:アプリケーションへのVNCベースのアクセスを試してください。オプションはここで異なります:

  • x11nvcまたはこのようなものを介してディスプレイ全体をエクスポートするだけで開始できます。
  • 特定のアプリケーションまたはウィンドウを「エクスポート」できるソフトウェアパッケージを使用します— Xpra および winswitch
  • X2Go のような完全な解決策ですが、もっと重いものを試してください。
5
kostix

私は実際にあなたのように見える問題に直面しています:一部のgtkアプリケーション(たとえば、meld)はsshで最初から開始するのに時間がかかり、他の一部(たとえば、シナプス)では開始しません。私は実際にはそれがどれほど遅いかについてより正確かもしれません:

$ echo "$TIMEFORMAT"
        %R
$ time meld --version
meld 3.20.0
        25.293

これは、私が見つけた他の遅いアプリケーション(nemo、gedit)とまったく同じ時間です。

Straceを使用してmeldを検査すると、これは決して来ないイベントを待っているようであり、正確に25秒のタイムアウトで存在しています。

この問題は、ここで報告されたものと同じである可能性が非常に高いです。 https://bbs.archlinux.org/viewtopic.php?id=230036

これはdbusの問題です。sshを介して設定されていないセッション環境のようなものです。残念ながら、私はこれを修正する方法を知りません。

Meldで見つけた唯一の回避策は、通常の方法で使用する前にバックグラウンドで起動することです。

編集する

それを見つけた ! dbusを単純に起動し、報告された変数をエクスポートします。

$ dbus-launch 
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-2EzslkNeji,guid=c9dec1622d6575f468559f8b5d9ee0e0
DBUS_SESSION_BUS_PID=4745

上記を設定してエクスポートすると、次のようになります。

$ time meld --version
meld 3.20.0
        0.268

これをリモートの起動スクリプトに入れて、ここで報告します。

ファローアップ

これはかなり冗長であり、主に範囲外ですが、私が目にする投稿では、簡単に試せるコピー/貼り付けソリューションが好きなので、あなたもそうすることを除いて、私はそうするかもしれません。以下をsshにフィードするためのセッションスクリプトとしてテストしました(例:ssh -X my @ dark-side〜/ bin/session):

#!/bin/bash

LAUNCH=(
    #   xload
    #   Thunderbird
      dbus
      konsole
)

Tmp=$(mktemp -d)
mkdir -p $Tmp

KILLS=()
WAITS=()

echo "info: starting session" >&2

app_dbus() { # # Launch dbus and remember to kill
  # redirect error because of "create ~/.dbus/session-bus/" 
  # deal with failure by checking DBUS_SESSION_BUS_PID afterwards
  dbus-launch > $Tmp/dbus.sh 2>/dev/null
  . $Tmp/dbus.sh

  if [ "$DBUS_SESSION_BUS_PID" ] && 
       ps --no-header -o pid -p "$DBUS_SESSION_BUS_PID" \
          > /dev/null 2>&1
  then
    export DBUS_SESSION_BUS_ADDRESS DBUS_SESSION_BUS_PID
    KILLS+=( $DBUS_SESSION_BUS_PID )
  else
    echo "warning: failed dbus" >&2
  fi
}
app_konsole() { # # Launch konsole and remember to wait for
  konsole &
  WAITS+=( $! )
}

for APP in "${LAUNCH[@]}"
do
  app_$APP
done

rm -r $Tmp  # not needed anymore

wait "${WAITS[@]}"

echo "info: ending session" >&2

for ID in "${KILLS[@]}"
do
  kill $ID
done
0
Champignac