Network

RubyでTAPを使ったトンネリングプログラムを実装してみる

こちらのサイトでシンプルな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%…

そんなわけでオレオレifconfigをRubyで書く為のC拡張「ruby-netif」を書いてみました。

こちら。こんな感じに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}" …

Linux上でオレオレifconfigを作るには

自分の書いているプログラムからNICの設定を直接弄りたくなった事はないだろうか? プログラム内からifconfigコマンドに引数をつけて実行すれば簡単に実現できるが、それはあんまり格好良くないし、情報を取り出そうとするとifconfigコマンドの出力文字列を…

ネットワーク関係記事まとめ 2013/06

以前もまとめたが、だいぶ古くなったので再度まとめてみる。 割り込みは直接ネットワークに関係しないのだが、ネットワークIOを語る際に外せない話題なので敢えてネットワーク関連記事に分類した。 Linux kernel features for high-speed networking bashで…

パケット受信処理の待ち合わせ部分

ネットワークスタックの、割り込みコンテキストからプロセスをたたき起こすまでの処理はしっかり読んだつもりなのだが、プロセスコンテキストで寝ている側を深く把握していなかったのでちょっと眺めてみる。 システムコールからプロセスがスリープするまで(…

Linuxでnetperfとかで負荷かけてる時に/proc/statとかを記録してグラフ化するツールあったらいいなと思ったので作った、という話

netperfで負荷かけている時にカーネルのstatistics情報取って色々とグラフ作るツールがあったらいいなぁ、と思ったので作った。今のところperf statで取れるようなCPUのキャッシュの情報とかが取れてないが…とりあえず netperfとかやってる間にログに数値を…

linux-3.1.6からlinux-3.2.0+(HEAD)へカーネルを上げたらネットワーク性能が落ちた

理由がはっきりしてないけどメモ。 ハード環境 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はsfc(SolarflareのNIC)専用だという話

CONFIG_RFS_ACCELは一言でいうとRFSをMultiqueue NIC上で実現する機能で、もう少し説明すると、あるパケットが届いたら宛先プロセスの所属するCPUに対して割り込めるようNICにヒントを出す、というものなのだが、どれくらいの範囲のNICに対応しているのかと…

netperf4をビルドする

並列に負荷をかける為の仕組みを持っているらしいのでちょっと試してみる。 $ svn co http://www.netperf.org/svn/netperf4/trunk netperf4 $ cd netperf4 $ /configure --enable-dependency-tracking --enable-histogram --enable-dns --enable-multi \ --e…

L2以下の送信処理

カーネルレベルのtunnelingとかしてる場合にどんなパスを通るのか良く分からなかったんで、ちと読んでみた。 Ethernetの場合 ip_output -> ip_finish_output -> (パケットサイズがMTUを超える時のみ ip_fragment) -> ip_finish_output2 -> neigh_output -> n…

RPSの挙動、キュー周りをもう一度確認

NICのドライバはパケットを受信してnetif_receive_skbかnapi_gro_receiveを呼ぶ。napi_gro_receiveの場合はGRO処理をパケットに施した後に結合済みパケットをnetif_receive_skbを呼ぶ。netif_receive_skbでenqueue_to_backlogをコール。 ret = enqueue_to_ba…

e1000 emulation Interrupt handling on Linux KVM

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…

VT-dでpassthroughしたデバイスの実機上での割り込みスレッドがpsで見えてる

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 ? …

SR-IOV Interrupt Handling on Linux KVM

画像をクリックして「オリジナルサイズを表示」を選択。

最近興味を持った論文リスト

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…

Intelの10Gイーサで遊んでみた 追試2

ちゃんと測れない気がするが、雰囲気をつかむためにこんな計り方をしてみた。 $ 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イーサで遊んでみた 追試

Intelの10Gイーサで遊んでみた - かーねる・う゛いえむにっきの続き。恐らく、Interrupt Stormが起きているから性能が落ちているのではなく、継続的にInterrupt Stormのワーニングを吐いているせいで性能が落ちているのではないか、というのが今の所の結論。それ…

Intelの10Gイーサで遊んでみた

手元に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…

VIOPS06で「RPS・RFS等最新Linux Kernel事例」と題してお話してきました

はじめに 第一回カーネル/VM探検隊@関西、第二回日本Vyattaユーザ会ミーティングで行った発表のダイジェスト版です。詳しく知りたい人はこちらの内容ではなく、第二回日本Vyattaユーザ会ミーティングの動画、資料をみる事をお勧めします。あと、最新って書…

igb(4)を理解する為にデータシートを読む(RSSハッシュテーブルの初期化と書き換え)

前の記事と同じく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(4)を理解する為にデータシートを読む(RSSハッシュ関数用のシード設定)

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…

igb(4)を理解する為にデータシートを読む(RSSハッシュキーの取り出し)

まずはこのフローを見てもらうと分かりやすいのだけれど、FreeBSDのイーサーネットドライバでは割り込みハンドラ(em_irq_fast)からtaskqueue_enqueueを呼んでカーネルスレッドを起こして、このスレッドが実際にパケットを取り出しに行く(em_irq_fast)。フロ…

Google Summer of Code 2011

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のパケットディスパッチについて

探検隊での発表や、FreeBSD/i386のパケット受信フロー - かーねる・う゛いえむにっきの補足。まず、話の前提のおさらいから。 マルチコア環境でネットワーク受信処理をスケールさせるには、NICに届く沢山のパケットを複数のコアへばらまいて並列に処理させる…

Direct Cache Accessについて理解を深める為、CPUのデータシートも読んでみる

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…

Direct Cache Accessについて理解を深める為、MCHのデータシートを読んでみる

Intel I/O Acceleration Technologyの構成要素で一番「!?」となったDirect Cache Accessについて、第一回 カーネル/VM探検隊@関西では調査不足で十分に説明出来てなかったので調べてみた。元となる論文はこれなのだが: Direct Cache Access for High Ba…

Direct Cache Accessについて理解を深める為、NICのデータシートも読んでみる

DCA対応NICはいくつかあるようだが、例えばIntel® 82598 10 GbE Controller Datasheetの3.5.6 DCAに書いてある。これによると、初期化時にドライバは送り先CPU ID・CPU Bus IDを設定してDCAを初期化する必要があり、DCAが有効化されるとPCIe TLBヘッダのTAG …

NetBSD/i386のパケット受信フロー

まぁ予想通りというか、依然としてOpenBSDとかなりの部分が共通してますね。 ロック粒度と並列性ですが…割り込み以外でBig kernel lockは使わないのでOpenBSDのようにシステムコールでブロックしてしまってプロセスの並行実行を阻害したりはしないものの、サ…

FreeBSD/i386のパケット受信フロー

TCPとフォワーディングをサクっと省略しちゃった簡易バージョン。 LinuxみたいにRCUとかは使ってなくて粒度の細かいロックがそれぞれのデータに対して存在してて、ハードウェア割り込みもソフト割り込みもそれぞれスレッドで処理してるという事のよう。