問題タブ [gen-tcp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
erlang - erlang gen_tcp:recv ブロック
こんにちは、私はこのような状況にあります:
を使用gen_tcp:recv(Sock,0)
しますが、サーバーからのメッセージには特定の終了パターンがないため、recv でクライアントがブロックされないようにする方法はありますか?
ドキュメントから:
erlang - gen_tcp ソケットから一定量のデータを受け取る
gen_tcp ソケットを使用する次のコードがあります。これは、{active, true}
常にサイズ 5 のバイナリ コマンドを使用して受信する必要があります (例: Command = <<"hello">>
)
しかし、次のようにクライアントとして接続しようとすると:
私は受信部分に持っています:
私のエラーはパターンマッチングにあると思います...しかしどこで?
ssl - プロセスがソケットクローズメッセージを受信するまでの時間
ソケット(gen_tcp / ssl)を処理しているErlangプロセスがあり、ピアが接続を閉じたとします。
プロセスが次のようなメッセージを受信するまでにどのくらい時間がかかりますか。
また
この時間はErlangコードのどこかで指定されていますか、それともシステムに関連していますか?
erlang - ソケットを介して正確なバイト数を送信する
gen_tcp を使用する Erlang では、ソケットを介して送信されたデータを単一のストリームに集約できることを読みました。ソケットに特定のバイト数を正確に送信させるにはどうすればよいですか?
sockets - Erlangのgen_tcpを使用して、トラフィックの多いソケットサーバーを構築するスケーラブルな方法です
シンプルだがスケーラブルなネットワークプログラミングを行うためにErlangを学ぼうとしています。私は基本的に、インターネットのバックボーン上のサーバーが実行することを実行するプログラムを作成したいと思っていますが、小規模です。イントラネット[原文のまま]へのゲートウェイとして機能し、接続されたクライアントや他のゲートウェイにデータをルーティングするWebアクセス可能なサーバーを使用してイントラネットをセットアップしようとしています。
トラフィックが多いのは、データがクライアントからゲートウェイ、クライアントに流れるだけでなく、宛先に到達するためにいくつかのゲートウェイをバウンスしなければならない可能性があるという事実から生じます(データがインターネット上をどのように移動するかなど)。これは、ゲートウェイがクライアントからのトラフィックだけでなく、他のゲートウェイのクライアントからのトラフィックも処理する必要があることを意味します。
これにより、中程度の数のクライアントとゲートウェイであっても、異常に高いレベルのトラフィックが発生する可能性があると考えました。
Pythonのバックグラウンドと、程度は少ないが他のスクリプト言語から来て、私は自分の問題を解決するためにカスタマイズされたモジュールを探すことに慣れています。Erlangはトラフィックの多いネットワークプログラミング用に設計されていることは理解していますが、この種のもののライブラリ/モジュールに関して私が見つけたのはgen_tcpだけでした。
これは、Erlangがすでにこの種のものに最適化されているため、最も基本的なモジュールで起動して、適切に拡張できることを期待できることを意味しますか?
erlang - 送信を遅らせるErlanggen_tcp
私は、多くの長寿命の同時接続用のErlangWebサーバーの一部として以下のコードを持っています。
delay_send
とオプションを追加したにもかかわらずnodelay
、データをバッファリングしているようです。そのため、データの大きなチャンクが送信されるか、サーバーが強制終了されるまで、小さなデータは送信されません。これはなぜですか。また、すべてのデータをすぐに送信するように強制するにはどうすればよいですか。
erlang - gen_tcp:recv が受け取ったバイナリは何ですか?
0に設定packet
しても、1、2、4 に設定しても、常に次のようになります。
gen_tcp:send(S1,term_to_binary("1"))。出力 <<131,107,0,1,49>>
gen_tcp:send(S1,term_to_binary(a))。出力 <<131,100,0,1,97>>
gen_tcp:send(S1,term_to_binary("abcd"))。出力 <<131,107,0,4,97,98,99,100>>
gen_tcp:send(S1,term_to_binary(1))。出力 <<131,97,1>>
私の質問は:
1. <<131,107>> とは何ですか?
2. 「1」の代わりに 1 を送信し、「131,107,0,1」のようにパケット長のないバイナリを取得するのはなぜですか?
web-services - gen_tcp 受信 CPU 使用率が非常に高い
私はErlangの初心者で、ばかげた質問をするかもしれません。しかし、問題を解決するのを手伝ってください。
私は、使用しているノードを Node.js に置き換えるために Erlang サーバーを作成しました。これにより、すべてのメモリが消費されました。Erlang が解決策になることを祈っています。サーバーは単体テストと内部テストでは正常に動作しますが、ストレス テストでは CPU 使用率が高くなります。
トリミングした後、CPU バーストはクライアントからの TCP 受信が原因であることがわかりました。
関数の開始時にプロセスを 10 時間スリープさせてみましたが (受信を呼び出さないようにするため)、CPU はまったくバーストしませんでした。したがって、CPU のバーストは TCP 受信が原因であると結論付けます。(間違っていたら訂正してください)
私のストレステストに関する情報は次のとおりです。
- 次のように Erlang サーバーを起動します: erl +zdbbl 2097151 -K true +A 128 +P
- 5000000 connect 5000 クライアントを Erlang サーバーにそれぞれ接続
- クライアントはサーバーに 1 分ごとに 2 バイトのデータを送信します。
- 接続が完了します (つまり、1 分あたり 2 バイトのデータのみが実行されます)、CPU は ~30%sy にバーストします (「トップ」から)
Erlang サーバーに Amazon Linux AMI (ラージ インスタンス、64 ビット) を使用しています。バーストはLinuxが原因ですか?システムがどのようにCPUを使い果たすかわかりません。それとも私の貧弱なコードの問題ですか?(そう信じる...)
実際の状況では、私たちのサーバーはピンポンだけでなく、より多くの負荷がかかるメッセージも受信します...これは最初のステップにすぎません...
私を救ってくれる人に何百万という感謝を。
アニタ~*
~~~~~~~~~~~~~~~~~~~~~~~
大規模インスタンスに関する情報 (参考):
- 7.5GBのメモリ
- 4 つの EC2 コンピューティング ユニット (それぞれ 2 つの EC2 コンピューティング ユニットを備えた 2 つの仮想コア)
- 850 GB のインスタンス ストレージ
- 64 ビット プラットフォーム
- I/O パフォーマンス: 高
file - Erlang:ファイルとファイル名を送信
ファイルとそのファイル名を送信するのは興味深いです。サーバーのオプション:
これがレシーバーループです。
私は次のファイルを送信します:
ファイルとファイル名を送信するとき
バイナリデータは可変構造です。
皆さんありがとう!
erlang - Erlang:gen_tcp:recv()はクライアントから送信されたパケットを受信しませんか?
パケットのバイト数を50に制限するために、このサーバーを使用するように変更しました。であるはずなのでgen_tcp:recv
、行をコメントアウトしました。これはクライアント側のerlシェルですinet:setopts(Socket, [{active, once}]),
gen_tcp:recv
{active,false}
これはサーバー側のerlシェルです
また、ソケットが作成されない{tcp_closed, Socket}
場合、戻り値でソケットが閉じられたかどうかをどのように知ることができるのでしょうか。gen_tcp:recv