私は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
を使用しており、Y
とC
(openvpnはすでにlzoで圧縮されている)を使用した場合と使用しない場合、および異なる暗号を実験的に試しましたが、同様の結果が得られました。
私はそれがGTKテーマかもしれないと考え始めています。それは本当に重いか何かかもしれません。
これが正常であるかどうかを誰かが知っていますか?レイテンシを減らすにはどうすればよいですか? (3-5は我慢できるかもしれませんが、20は多すぎます)
転送の問題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ベースのアクセスを試してください。オプションはここで異なります:
私は実際にあなたのように見える問題に直面しています:一部の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