跳轉到

tapioctl check 子命令

tapioctl check 是盤前 / 巡檢 / 故障時的第一站。

用法

tapioctl check <子檢查>

子檢查:pfiles | config | disk | logs | tcpdirect | tuning | all

回傳碼:

  • 0 — 通過(含警告級別)
  • 1 — 警告(可開盤但要處理)
  • 2 — 失敗(不能開盤)

各子檢查

pfiles — 期交所產品檔

呼叫 libexec/tapio_check pfiles

驗證 /opt/Tapio/data/taifex/<system_date>/ 下的產品檔:

  • 必要檔案齊全(P08P09P13P14 各 4 個副檔名 .10/.11/.20/.21,共 16 個)
  • P08(商品與時間流程群組定義檔)、P09(契約乘數)格式可解析(Tapio 內建 parser 試讀)

失敗對策

  • 缺檔 → 找交易室重跑 SFTP 下載
  • 格式錯 → 找開發

config — Tapio.toml 可讀

呼叫 libexec/tapio_check config

驗證 /opt/Tapio/etc/Tapio.toml

  • 檔案存在 + 可讀
  • TOML 語法正確
  • 所有必要欄位齊全
  • 值合理(CPU 編號在範圍內、port 數字、IP 格式 等)

失敗對策:找最近改過 Tapio.toml 的人。

disk — 磁碟使用率

檢查目錄列表:

路徑 required?
/opt/Tapio/data/taifex/ required
/opt/Tapio/log/ required
/opt/Tapio/ required
[livesync].watch_dir(讀自 Tapio.toml optional

對每個 mount point 看使用率:

  • ≥ 80% → 警告
  • ≥ 95% → 失敗

失敗對策

  • 立刻清舊 log(find /opt/Tapio/log -maxdepth 1 -type d -mtime +30 -exec rm -rf {} +
  • 或擴容磁碟

logs — daily log 是否在寫

找今天的 daily* log,看 mtime:

  • 最後一行 < 10 分鐘前 → 通過
  • 最後一行 ≥ 10 分鐘前 → 看時段:
    • 盤中(日盤 / 夜盤)→ 失敗(Tapio 可能掛了)
    • 盤前 / 日盤盤後 → 通過(正常無流量)

時段定義(TAIFEX):

時段 時間
日盤 08:45 – 13:45
夜盤 15:00 – 翌日 05:00

失敗對策

  • 盤中失敗 → tapioctl status 看 process 還在不在
  • 不在 → 看 log/$today/stdout/tapio-core.log 找死因
  • 還在但沒寫 log → 可能 hang / deadlock,先 gdb attach 拿 stack 再決定

tcpdirect — Onload / TCPDirect / NIC

檢查項目:

  • tcpdirect RPM 已裝
  • onloadopenonload RPM 已裝
  • /usr/lib64/libonload_zf.so 存在
  • libonload_zf.so 不是 debug build(路徑不含 */zf/debug/*
  • libonload_zf.so owner 是 tcpdirect-* RPM
  • lsmodonloadsfc_char kernel module

失敗對策

  • 缺 RPM → dnf install tcpdirect onload
  • 缺 kmod → 裝 kmod-onloadonload_tool reload
  • debug build → 重 build TCPDirect release

tuning — system 調校狀態

驗證 NetThread 隔離 CPU([system].net_thread_cpu)的 boot-time / install-time 調校沒有靜默漂移。實際發生過:irqbalance 套件升級覆寫 IRQBALANCE_BANNED_CPULIST,trading NIC IRQ 開始落到 NetThread CPU 上, GW_inbound stdev 增加 ~50%,但什麼錯誤都沒噴 — 必須要靠這支 check 攔到。

[system].net_thread_cpu,未設或為 -1 直接回 [N/A](不算 fail)。 否則設 N = net_thread_cpu,依序檢查:

  1. GRUB cmdline(失敗)— /proc/cmdlineisolcpus= / nohz_full= / rcu_nocbs= 三個參數都應該包含 CPU N。isolcpus=managed_irq,domain,3 這類含 flag 的形式會把 CSV 拆掉只比數字 token。
  2. irqbalance ban list(失敗,找不到 config 算警告)— /etc/sysconfig/irqbalanceIRQBALANCE_BANNED_CPULIST= 必須包含 CPU N,否則 irqbalance daemon 會把 IRQ 排到隔離 CPU 上。
  3. CPU N 中斷率(失敗)— 取 /proc/interrupts 兩個間隔 2 秒的 snapshot, 對 CPU N 欄做 delta,任何 IRQ 在這 2 秒內 +1 都算失敗(會搶先 NetThread busy-poll,是 GW_inbound jitter 的直接源頭)。 不另外做 effective_affinity 掃描——光看 affinity 不看 rate 會把 isolcpus=managed_irq 下合法坐在 CPU N 但不 fire 的 kernel-managed IRQ 全列為 false positive。rate sample 才是 ground truth。
  4. nohz_full 有效性(警告,僅當 tapio-core 在跑時做)— 取 LOC 的 CPU N 欄 2 秒 delta;> 0 表示 local timer tick 沒被抑制,通常是因為 CPU N 上不只 NetThread 一個 runnable task。

失敗對策

  • GRUB cmdline 不齊 → 改 /etc/default/grubgrub2-mkconfig 重開機, 詳見 install/grub.md
  • IRQBALANCE_BANNED_CPULIST 不齊 → 改 /etc/sysconfig/irqbalancesystemctl restart irqbalance,詳見 install/irq-affinity.md
  • CPU N 仍有 IRQ fire → 對 offending IRQ 寫 /proc/irq/<n>/smp_affinity 把它 移走(mask 排除 CPU N),詳見 install/irq-affinity.md

all — 跑全部

tapioctl check all

依序跑 pfiles → config → disk → logs → tcpdirect → tuning。每個 section 印小結,最後印總結。

回傳碼為各檢查中的最差(max)。

範例輸出:

== pfiles ==
[通過] pfiles: 期交所產品檔齊全 / 格式正確

== config ==
[通過] config: Tapio.toml 可被 Tapio 讀取

== disk ==
  - /opt/Tapio/data/taifex: 45% 使用中,剩 200 GiB  [通過]
  - /opt/Tapio/log: 82% 使用中,剩 30 GiB  [警告]
  - /opt/Tapio: 45% 使用中,剩 200 GiB  [通過]
[警告] disk: 0 錯誤,1 警告
      → 磁碟使用率 ≥ 80%,排時間清理

== logs ==
[通過] logs: Tapio.121719.txt 活著(2 分鐘前才寫過,現在 日盤 12:23)

== tcpdirect ==
[通過] tcpdirect: RPM 已裝、/usr/lib64/libonload_zf.so 為 release build、kmod 已載入

== tuning ==
[通過] tuning: GRUB cmdline / irqbalance ban / IRQ affinity / CPU 3 中斷率皆 OK

---
總結: 有警告但可開盤,排時間處理上面提到的項目