Network
こちらのサイトでシンプルなPythonの実装が配布されていたので、Rubyでも実装してみました。 require "socket" TUNSETIFF = 0x400454ca IFF_TAP = 0x0002 PEER = "192.168.0.100" PORT = 9876 tap = open("/dev/net/tun", "r+") tap.ioctl(TUNSETIFF, ["tap%…
こちら。こんな感じにRubyスクリプトでNICを設定できるぜいえーい eth = Netif.new("eth0") eth.up eth.mtu = 1000 eth.set_addr("172.0.0.1", "255.255.255.0") puts "addr:#{eth.addr}" puts "netmask:#{eth.netmask}" puts "broadaddr:#{eth.broadaddr}" …
自分の書いているプログラムからNICの設定を直接弄りたくなった事はないだろうか? プログラム内からifconfigコマンドに引数をつけて実行すれば簡単に実現できるが、それはあんまり格好良くないし、情報を取り出そうとするとifconfigコマンドの出力文字列を…
以前もまとめたが、だいぶ古くなったので再度まとめてみる。 割り込みは直接ネットワークに関係しないのだが、ネットワークIOを語る際に外せない話題なので敢えてネットワーク関連記事に分類した。 Linux kernel features for high-speed networking bashで…
ネットワークスタックの、割り込みコンテキストからプロセスをたたき起こすまでの処理はしっかり読んだつもりなのだが、プロセスコンテキストで寝ている側を深く把握していなかったのでちょっと眺めてみる。 システムコールからプロセスがスリープするまで(…
netperfで負荷かけている時にカーネルのstatistics情報取って色々とグラフ作るツールがあったらいいなぁ、と思ったので作った。今のところperf statで取れるようなCPUのキャッシュの情報とかが取れてないが…とりあえず netperfとかやってる間にログに数値を…
理由がはっきりしてないけどメモ。 ハード環境 Core i7 X980 24GB RAM Inttel 82599 10GbE Ethernet(ixgbe) linux-3.1.6 Intel阪ixgbeドライバは使わず .config iperfでのTCPスループット:9Gbpsを超える(ほぼワイヤレート) linux-3.2.0+(HEAD) Intel阪ixg…
CONFIG_RFS_ACCELは一言でいうとRFSをMultiqueue NIC上で実現する機能で、もう少し説明すると、あるパケットが届いたら宛先プロセスの所属するCPUに対して割り込めるようNICにヒントを出す、というものなのだが、どれくらいの範囲のNICに対応しているのかと…
並列に負荷をかける為の仕組みを持っているらしいのでちょっと試してみる。 $ svn co http://www.netperf.org/svn/netperf4/trunk netperf4 $ cd netperf4 $ /configure --enable-dependency-tracking --enable-histogram --enable-dns --enable-multi \ --e…
カーネルレベルのtunnelingとかしてる場合にどんなパスを通るのか良く分からなかったんで、ちと読んでみた。 Ethernetの場合 ip_output -> ip_finish_output -> (パケットサイズがMTUを超える時のみ ip_fragment) -> ip_finish_output2 -> neigh_output -> n…
NICのドライバはパケットを受信してnetif_receive_skbかnapi_gro_receiveを呼ぶ。napi_gro_receiveの場合はGRO処理をパケットに施した後に結合済みパケットをnetif_receive_skbを呼ぶ。netif_receive_skbでenqueue_to_backlogをコール。 ret = enqueue_to_ba…
qemu cpu_exec -> cpu_init -> cpu_x86_init -> qemu_init_vcpu -> qemu_kvm_start_vcpu -> qemu_thread_create(qemu_kvm_cpu_thread_fn) -> kvm_cpu_exec -> kvm_vcpu_ioctl(KVM_RUN) -> ** block ** linux kernel kvm_vcpu_ioctl -> kvm_arch_vcpu_ioctl_r…
syuu@ubuntu:~$ ps ax|grep kvm|grep irq 1024 ? S< 0:00 [kvm-irqfd-clean] 6353 ? S 0:00 [irq/81-kvm:0000] 6354 ? S 0:02 [irq/82-kvm:0000] 6355 ? S 0:00 [irq/83-kvm:0000] 6359 ? S 0:01 [irq/84-kvm:0000] 6360 ? S 0:02 [irq/85-kvm:0000] 6361 ? …
画像をクリックして「オリジナルサイズを表示」を選択。
1996 The effectiveness of affinity-based scheduling in multiprocessor networking An Evaluation of Network Stack Parallelization Strategies in Modern Operating Systemsと近い内容らしい 2000 End-System Optimizations for High-Speed TCP Zerocop…
ちゃんと測れない気がするが、雰囲気をつかむためにこんな計り方をしてみた。 $ while :; do vmstat -i|tee -a intr.log;sleep 1;done ix0 irq intr/sec ix0:que 0 1.0526315789 ix0:que 1 1.0526315789 ix0:que 2 866.3684210526 ix0:que 3 1.0526315789 ix0:…
Intelの10Gイーサで遊んでみた - かーねる・う゛いえむにっきの続き。恐らく、Interrupt Stormが起きているから性能が落ちているのではなく、継続的にInterrupt Stormのワーニングを吐いているせいで性能が落ちているのではないか、というのが今の所の結論。それ…
手元にIntel Ethernet Server Adapter X520-DA2×2とSFP+のケーブルが届いたのでちょっと遊んでみた。 構成 FreeBSDマシン CPU Core i7 X980(物理6コア、論理12コア) RAM 24GB Kernel FreeBSD 9.0-current Linuxマシン CPU Core 2 Quad Q6600(物理=論理4…
はじめに 第一回カーネル/VM探検隊@関西、第二回日本Vyattaユーザ会ミーティングで行った発表のダイジェスト版です。詳しく知りたい人はこちらの内容ではなく、第二回日本Vyattaユーザ会ミーティングの動画、資料をみる事をお勧めします。あと、最新って書…
前の記事と同じくigb_initialize_receive_unitsをみると、RETAというところへ書き込んでいる: union igb_reta { u32 dword; u8 bytes[4]; } reta; /* Warning FM follows */ for (int i = 0; i < 128; i++) { reta.bytes[i & 3] = (i % adapter->num_queues…
igb_initialize_receive_unitsをみると arc4rand(&random, sizeof(random), 0); でランダムな値を取得してきて for (int i = 0; i < 10; i++) E1000_WRITE_REG_ARRAY(hw, E1000_RSSRK(0), i, random[i]); で書き込んでいる。 データシートを読むとRSSRKはRSS…
まずはこのフローを見てもらうと分かりやすいのだけれど、FreeBSDのイーサーネットドライバでは割り込みハンドラ(em_irq_fast)からtaskqueue_enqueueを呼んでカーネルスレッドを起こして、このスレッドが実際にパケットを取り出しに行く(em_irq_fast)。フロ…
FreeBSDプロジェクトでGSoCにApplyしたら採択してもらえました。 Proposalはこちら: http://www.google-melange.com/gsoc/proposal/review/google/gsoc2011/syuu1228/1内容としては、最近調べて回ってるネットワークIO周りの延長線上で、tcpdumpやらwiresha…
勉強しながら書いているので、古い記事は十分に理解せずに書いていたり、一部内容が重複する記事を書いていたりしてるが、一度まとめてみようと思う。 NetBSD-current ip_flowを通らない場合のNetBSD-currentのIPパケット受信処理 ファストパスとBSD NetBSD-…
探検隊での発表や、FreeBSD/i386のパケット受信フロー - かーねる・う゛いえむにっきの補足。まず、話の前提のおさらいから。 マルチコア環境でネットワーク受信処理をスケールさせるには、NICに届く沢山のパケットを複数のコアへばらまいて並列に処理させる…
CPUについては、Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3B: System Programming Guide, Part 2に書いてある。 Table B-2. IA-32 Architectural MSRsにDCA関連のレジスタがあった: 1F8H IA32_PLATFORM_DCA_CAP DCA Capabili…
Intel I/O Acceleration Technologyの構成要素で一番「!?」となったDirect Cache Accessについて、第一回 カーネル/VM探検隊@関西では調査不足で十分に説明出来てなかったので調べてみた。元となる論文はこれなのだが: Direct Cache Access for High Ba…
DCA対応NICはいくつかあるようだが、例えばIntel® 82598 10 GbE Controller Datasheetの3.5.6 DCAに書いてある。これによると、初期化時にドライバは送り先CPU ID・CPU Bus IDを設定してDCAを初期化する必要があり、DCAが有効化されるとPCIe TLBヘッダのTAG …
まぁ予想通りというか、依然としてOpenBSDとかなりの部分が共通してますね。 ロック粒度と並列性ですが…割り込み以外でBig kernel lockは使わないのでOpenBSDのようにシステムコールでブロックしてしまってプロセスの並行実行を阻害したりはしないものの、サ…
TCPとフォワーディングをサクっと省略しちゃった簡易バージョン。 LinuxみたいにRCUとかは使ってなくて粒度の細かいロックがそれぞれのデータに対して存在してて、ハードウェア割り込みもソフト割り込みもそれぞれスレッドで処理してるという事のよう。