ただの存在を発見しましたsslh
。
Debian 7を実行している512MB RAM VPSにインストールしてみました。設定が完了した後、sslh
apache2仮想ホストの1つに接続しようとしましたが、CPU使用率はすぐに50〜60%に達し、リソース不足のためにSSHを介してVPSに接続できなくなりました。
- これは普通ですか?
- 有効な選択肢はありますか?
私が解決しようとしている問題sslh
は、多くの無料Wi-Fiホットスポットが80と443を除くほぼすべてのポートをブロックしており、ISPが提供するホームサーバーに接続するためにOpenVPNを使用する必要があることです。
提案できる他のソリューションはありますか?
答え1
出所を思わず検討した結果、著者が過度に熱心にset_nonblock
使用したようです。SSLH-select.c。
各ソケットが非ブロック化されている場合(そうであるように)、ループは
while(1) {
select(… a bunch of non-blocking sockets …);
}
リンクされたファイルの230行付近で待機中になります。つまり、読み込むソケットにデータがない場合でも、selectはすぐに返され、すぐに再度呼び出されます。これはかなりプロセッサ集約的です。
作成者は条件付きでパラメータを使用してほぼ正しく処理しましたが、timeout
とにかく非select
ブロックに設定されている場合は効果がありません。
sslh
これが実際の原因であることを確認するための最良の方法は扱っていません。
答え2
今質問はここにあります。https://github.com/yrutschle/sslh/issues/24
mswの答えは徹底的ですが、また間違っています。select()
ソケットの状態に関係なくブロックします。これは基本的にその目的であり、実際にブロックソケットを使用するコードは使用O_NONBLOCK
時にselect()
間違っています。 Linuxの場合select(2)
:「Linuxでは、select()
後続の読み取りがブロックされている間にソケットファイル記述子が「読み取り準備完了」として報告されることがあります。
つまり、O_NONBLOCK
設定せずに使用すると、select()
プログラムが完全にブロックされる可能性があります。
したがって、問題があるかもしれませんが、そうではありません。