- 締切済み
Linux UDPサーバーに対するクライアント数
CentOS release 4.6(カーネル 2.6.9-67)上でUDPサーバーを開発していますが、同一ポートに対して複数クライアントからの通信を確認しています。250クライアント位までは同時通信してもパケットロスはほとんど発生しないのですが、250クライアント以上で同時通信を行うと、最大250クライアント位まで通信可能ですが、残りのクライアントについてクライアントからのパケットロスが発生します。 UDPなので多少のパケットロスしかたないのですが、なぜ最大250クライアント位までしか同時通信ができないかを調べています。 UDPサーバー側の送受信バッファはソケットオプションで大きめに設定しています。 カーネルパラメータやソケットオプションなどで、同一ポートに対しての同時通信が可能なクライアントを制限するようなパラメータはあるのでしょうか? 有識者の方がいましたらご教示下さい。 宜しくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- onosuke
- ベストアンサー率67% (310/456)
>ネットワーク全体は別担当が管理しており、ネットワーク全体からみると問題ないパケット量。 >linux側でなにかパラメータなどがあるのではという見解になり。 netstat -sコマンドを利用すると、 Linux側(プログラム)で取りこぼしが発生しているかどうかがわかります。 Udp: 390529424 packets received 13288 packets to unknown port received. 848 packet receive errors ←受信したが、プログラムが取りこぼしたパケットの数 243773 packets sent
- onosuke
- ベストアンサー率67% (310/456)
>同一ポートに対しての同時通信が可能なクライアントを制限するような >パラメータはあるのでしょうか? ありません。UDPプロトコル自体にそのような仕組みがないため、無理です。 必要であれば、上位プロトコルで制御の仕組みを実装してください。 >UDPサーバー側の送受信バッファはソケットオプションで大きめに設定しています。 いくらバッファを大きめに設定しても、サーバプログラムの処理性能を超える 勢いでパケットが到達すれば取りこぼしが発生します。 ・カーネルバッファからの取り出し処理(recvfrom) ・取り出し後の雑多な処理 が並列動作するように考慮しないと、ある程度以上の処理性能は見込めません。 また、送受信バッファの大きさですが、 ソケットオプションでいくらおおきな値を入れても、net.core.rmem_maxが上限値となります。 ソケットオプションでnet.core.rmem_max以上の値を指定する場合は、 net.core.rmem_max値も合わせて大きくしてください。
お礼
回答ありがとうございます。 net.core.rmem_maxの設定とsocketoptの設定でどうにかなりました。 ありがとうございました。
- saijyo_739
- ベストアンサー率53% (119/222)
> UDPサーバー側の送受信バッファはソケットオプションで大きめに設定しています。 これ(大きめに設定)ってUDPサーバのバッファですか、それともLinuxカーネルのバッファですか。 http://www.ibm.com/developerworks/jp/linux/library/l-hisock/ ※ 上記ページに『表1. TCP/IPスタックの性能を向上させる変更可能なカーネル・パラメータ パラメータの調整で一番大事なことは、いろいろな設定で試してみるということです。アプリケーションの動作、プロセッサの速度、メモリーの使用率によって、これらのパラメータがシステムの性能をどう変えるかが決まります。システムの性能を上げるつもりが、逆に下げてしまう場合があるかもしれません(またはその逆の場合もあるかもしれません)。ですから、オプションを1つずつ実行し、その結果を確認するのが一番確実な方法です。』とあります。 http://opensuse-man-ja.berlios.de/opensuse-html/cha.tuning.network.html http://www.anarg.jp/personal/t-tugawa/note/linux/sockbuf.html http://archive.linux.or.jp/JM/html/LDP_man-pages/man7/udp.7.html /proc インタフェース { udp_mem (Linux 2.6.25 以降) } サーバ・クライアント側とも十分なカーネルバッファがないと処理できませんよ。 BSDだとnetstat -mでmbufの利用状況がわかるのだけどLinuxだとなんだったかな。(Linuxのnetstatコマンドには-mはありません) % netstat -m 386/259/645 mbufs in use (current/cache/total) 384/134/518/20864 mbuf clusters in use (current/cache/total/max) 384/128 mbuf+clusters out of packet secondary zone in use (current/cache) 0/0/0/0 4k (page size) jumbo clusters in use (current/cache/total/max) 0/0/0/0 9k jumbo clusters in use (current/cache/total/max) 0/0/0/0 16k jumbo clusters in use (current/cache/total/max) 864K/332K/1197K bytes allocated to network (current/cache/total) 0/0/0 requests for mbufs denied (mbufs/clusters/mbuf+clusters) 0/0/0 requests for jumbo clusters denied (4k/9k/16k) 0/5/5472 sfbufs in use (current/peak/max) 0 requests for sfbufs denied 0 requests for sfbufs delayed 0 requests for I/O initiated by sendfile 0 calls to protocol drain routines
お礼
回答ありがとうございます。 net.core.rmem_maxの設定とsocketoptの設定でどうにかなりました。 ありがとうございました。
- wingstar
- ベストアンサー率37% (102/275)
上記だけでは詳しく構成がわからないのですが、例えばサーバも含めたネットワーク全体で考えなければいけないのではないかと思いました。 例えば、使用されているスイッチングHUBは、それだけの通信を一気に裁ける能力を有しているのかなど。 Gigabitのスイッチだから、全ポートが常に1Gbpsで通信可能なのかも、関わってくるのではないかと思います。 あくまで一例なので、その他ボトルネックになりそうなところを指摘してほしい場合は、構成図なども添えると、その道のプロからの回答もあるかもしれません。
お礼
早速の回答ありがとうございます。 150バイトのUDPパケットを一斉に送信をしているだなのです。 ネットワーク全体は別担当が管理しており、ネットワーク全体からみると問題ないパケット量。linux側でなにかパラメータなどがあるのではという見解になり。いろいろ調べております。その一環でOKwebに質問した次第です。
お礼
回答ありがとうございます。 参考させて頂きます。 ありがとうございました。