libmoon の構造と設定ファイルの使い方

ディレクトリ構成の概要

libmoon は高性能パケット処理を実現する Lua ベースのフレームワークであり、そのプロジェクト構成は明確に分離されています。以下が主要なディレクトリ構成です。

libmoon/
├── bin/
├── build/
├── config/
├── deps/
├── examples/
├── lib/
├── scripts/
├── src/
├── test/
├── CMakeLists.txt
├── README.md
└── LICENSE
  • bin/: コンパイル後の実行可能バイナリが配置されます。
  • build/: CMake によるビルド中に生成される中間オブジェクトやキャッシュファイルが格納されます。
  • config/: ネットワークインターフェースやキューの動作設定を記述した構成スクリプトを保持します。
  • deps/: DPDK などの外部依存ライブラリが含まれます。
  • examples/: 実際の使用例を示すサンプルスクリプトが収録されており、学習やテストに利用できます。
  • lib/: 内部で使用される共通関数やモジュールが配置されています。
  • scripts/: 起動やデプロイメントに使用される補助スクリプトが含まれます。
  • src/: C/C++ で書かれたコアロジックやバインディングコードが置かれています。
  • test/: 単体テストや統合テスト用のコードが含まれます。
  • CMakeLists.txt: ビルドシステムの定義ファイルで、コンパイル手順やリンク設定を記述しています。
  • README.md: プロジェクトの概要、ビルド方法、基本的な使い方に関する説明が記載されています。
  • LICENSE: 使用許諾条件が記述されたオープンソースライセンスファイルです。

起動スクリプトの役割と構成

libmoon の実行フローは通常、Lua で記述された起動スクリプトによって制御されます。主なエントリポイントは scripts/ ディレクトリ内にあり、代表的なものとして以下のようなスクリプトがあります。

-- scripts/run_example.lua

function main_task()
    -- 利用可能なネットワークデバイスを取得
    local ifaces = libmoon.list_interfaces()
    
    for _, port in ipairs(ifaces) do
        -- 各ポートを初期化:RX/TX キューを4つずつ設定
        port:configure{
            rxQueues = 4,
            txQueues = 4
        }
    end

    -- スレーブタスク(ワーカースレッド)を非同期で開始
    libmoon.launch_workers()
end

-- メインタスクとして起動
libmoon.run(main_task)

このスクリプトでは、メインスレッドがネットワークインターフェースのセットアップを行い、その後ワーカースレッドを起動してパケット処理を分散実行します。これは典型的な master-worker アーキテクチャの実装です。

設定ファイルの設計と適用方法

静的なパラメータは別途設定ファイルに切り出して管理することで、再利用性と保守性が向上します。以下は config/ 配下に置くことができる設定例です。

-- config/network_settings.lua

return {
    interface = {
        mtu = 1500,
        numRxQueues = 8,
        numTxQueues = 8
    },
    ring_buffer = {
        capacity = 2048,
        burstSize = 32
    },
    timing = {
        statsInterval = 5.0  -- 統計出力の間隔(秒)
    }
}

これらの値は実行スクリプト内で読み込まれ、実際のデバイス構成に反映されます。たとえば以下のように利用可能です。

local settings = require("config.network_settings")

function setup_interface(port_id)
    local dev = libmoon.get_device(port_id)
    dev:configure{
        rxQueues = settings.interface.numRxQueues,
        txQueues = settings.interface.numTxQueues
    }
end

このように、設定値を外部化することで、異なる環境や要件に応じた柔軟な対応が可能になります。

タグ: libmoon DPDK lua Network-Programming packet-processing

6月22日 21:05 投稿