[205] | 1 | 豊岡拓 |
---|
| 2 | |
---|
| 3 | ftrace snapshotを作った、Kernel 3.9で利用可能になる |
---|
| 4 | |
---|
| 5 | トレースとは |
---|
| 6 | この発表においては、プログラムの実行を理解する上で有益なデータをバッファ等に記録すること |
---|
| 7 | 用途 |
---|
| 8 | デバッグ |
---|
| 9 | 障害解析 |
---|
| 10 | 常時トレースを動かしておき、システムが停止した時にダンプを用いて理由を解析する |
---|
| 11 | 性能解析 |
---|
| 12 | どこが時間を食っているのか |
---|
| 13 | ボトルネック解析 |
---|
| 14 | ftrace |
---|
| 15 | カーネルに組み込まれているトレース機構 |
---|
| 16 | 元々はRTツリーのFunction tracerから始まった (なのでftrace) |
---|
| 17 | 現在では様々なトレース機能が統合されている |
---|
| 18 | Events |
---|
| 19 | Latency |
---|
| 20 | 最大の割り込み禁止期間を知りたい |
---|
| 21 | Stack |
---|
| 22 | Block, mmio |
---|
| 23 | Dynamic events |
---|
| 24 | 好きなところにbreakpointを設置 |
---|
| 25 | Trace Events |
---|
| 26 | あらかじめ埋め込まれたトレースポイントを踏んだ時にイベントを記録 |
---|
| 27 | 現在のLinux Kernelでは500以上が設定されている |
---|
| 28 | syscallを含めるともっと |
---|
| 29 | Kernelの中のTrace bufferに記録される |
---|
| 30 | 記録されるデータ |
---|
| 31 | PID |
---|
| 32 | CPUID |
---|
| 33 | タイムスタンプ |
---|
| 34 | イベント名 |
---|
| 35 | イベント毎の引数 |
---|
| 36 | Kernelsharkというツールで可視化出来る |
---|
| 37 | Fedoraには標準である |
---|
| 38 | Function Tracer |
---|
| 39 | カーネル内の全ての関数呼び出し・リターンを記録出来る |
---|
| 40 | コールグラフ、処理時間が分かる |
---|
| 41 | Irqsoff Tracer |
---|
| 42 | 最大の割り込み禁止区間を検出 |
---|
| 43 | 「最大で8013us発生したよ」 |
---|
| 44 | RTOSだとかなり大きい遅延 |
---|
| 45 | ftraceの全体像 |
---|
| 46 | hook mechanisms |
---|
| 47 | mcount |
---|
| 48 | tracepoint |
---|
| 49 | kprobes |
---|
| 50 | (uprobes) |
---|
| 51 | plugin tracers |
---|
| 52 | function |
---|
| 53 | irqsoff |
---|
| 54 | wakeup |
---|
| 55 | stack trace |
---|
| 56 | trace event |
---|
| 57 | common components |
---|
| 58 | debugfs I/F |
---|
| 59 | ring buffer |
---|
| 60 | debugfs経由で操作 |
---|
| 61 | /procの様なもの |
---|
| 62 | 疑似ファイルをecho, catする |
---|
| 63 | trace-cmd |
---|
| 64 | /sys/kernel/debug/tracing/ 以下にファイルが出来る |
---|
| 65 | current_tracer |
---|
| 66 | どのpluginを使うか指定する |
---|
| 67 | トレースバッファ |
---|
| 68 | ロックレスリングバッファ |
---|
| 69 | 記録を読み出しを並行して行える |
---|
| 70 | # cat trace するだけでバッファを読み出せる |
---|
| 71 | テキスト形式 |
---|
| 72 | バッファ内のデータは消費されない |
---|
| 73 | 書き込み可能、かつO_TRUNCでopenするとクリア |
---|
| 74 | # echo > trace |
---|
| 75 | trace_pipe |
---|
| 76 | traceに似ている |
---|
| 77 | バッファ内のデータを読んだ際に消費する |
---|
| 78 | trace_pipe_raw |
---|
| 79 | バイナリ形式で生の情報を出力する |
---|
| 80 | splice(2)でゼロコピー転送が可能 |
---|
| 81 | cpu毎のI/Fしかない |
---|
| 82 | 一度に全部のCPUを読み込むことは出来ない |
---|
| 83 | options/ |
---|
| 84 | options/overwrite |
---|
| 85 | バッファが満杯になった時に上書きするか、記録をやめるか |
---|
| 86 | 1 -> 古いイベントを捨てる (デフォルト) |
---|
| 87 | 0 -> 記録停止 |
---|
| 88 | events/ |
---|
| 89 | イベントの有効・無効を制御 |
---|
| 90 | filter |
---|
| 91 | 特定の条件を満たすイベントだけを記録出来る |
---|
| 92 | trace_marker |
---|
| 93 | ユーザ空間からトレースバッファにイベントを記録する |
---|
| 94 | write(2)で好きな文字列を書き込むだけで記録出来る |
---|
| 95 | アプリケーションの動作チェックなどに有用 |
---|
| 96 | 最近入った・入る予定の機能 |
---|
| 97 | Kprobes event(2.6.33~) |
---|
| 98 | 動いているカーネルに動的に好きな場所にイベントを埋め込める |
---|
| 99 | カーネルの改造不要 |
---|
| 100 | Uprobes event (2.6.35~) |
---|
| 101 | Kprobesのユーザ空間番 |
---|
| 102 | アプリケーションの改造不要 |
---|
| 103 | Ojbdumpなどでアドレスを持ってくる必要がある |
---|
| 104 | Snapshot(3.9~) |
---|
| 105 | トレースを止めずに、ある瞬間のバッファのスナップショットを取る機能 |
---|
| 106 | 予備のトレースバッファを用意しておいて、好きなタイミングで切り替える |
---|
| 107 | # echo 1 > snapshot |
---|
| 108 | これだけでスナップショットが取られる |
---|
| 109 | この際に予備のバッファも割り当てられる |
---|
| 110 | バッファの割り当て時間が気になる場合は、あらかじめ1を書いてバッファを確保しておくと良い |
---|
| 111 | Multi-buffer(3.10~?) |
---|
| 112 | トレースバッファを用途別に複数個使い分ける機能 |
---|
| 113 | 今までは一つのグローバルバッファしかなかった(せいぜいCPU毎) |
---|
| 114 | バッファの個数はmkdir/rmdirで動的に変更可能 |
---|
| 115 | # cd instances/; mkdir buf_1 |
---|
| 116 | 今のところ、Trace Eventsのみ利用可能 |
---|
| 117 | Function-trigger |
---|
| 118 | 特定の関数が呼ばれた時にアクションを起こす |
---|
| 119 | トーレス全体のOn/Off |
---|
| 120 | 特定のイベントが呼ばれたらトレースイベントをOn/Off |
---|
| 121 | スナップショットを取る |
---|
| 122 | スタックトレースを取る |
---|
| 123 | # echo 'vfs_read:snapshot:1' > set_ftrace_filter |
---|
| 124 | trace_clock |
---|
| 125 | タイムスタンプの種類を変更出来る |
---|
| 126 | 基本的にはTSCベース |
---|
| 127 | local -> CPU間で同期を取らない |
---|
| 128 | global -> ロックを取って同期させる |
---|
| 129 | counter -> 順番だけを見たい時 |
---|
| 130 | x86-tsc (3.8~) -> 生のTSC |
---|
| 131 | local/globalはTSCをマイクロ秒などに変更している |
---|
| 132 | uptime -> jiffersだけなので軽い |
---|
| 133 | perf -> perfと同じタイムスタンプをつける |
---|
| 134 | Q/A |
---|
| 135 | オーバーヘッドはどれくらいか |
---|
| 136 | どれくらいのイベントをOnにするかによる |
---|
| 137 | 取りたいイベントをあらかじめOnにして、その後負荷の具合を見ながら調整する |
---|
| 138 | 記録する際にロックを取るなどによりメモリ帯域を食ってしまうことはないか |
---|
| 139 | 基本的にCPU間でロックを取ることはない(ロックレス) |
---|
[206] | 140 | |
---|
| 141 | |
---|
| 142 | @Fantom_JAC |
---|
| 143 | いまさら聞けないZigBee |
---|
| 144 | ZigBeeは日本では名前しか知られてない |
---|
| 145 | というか、まともな日本語の本も出ていない |
---|
| 146 | |
---|
| 147 | ZigBeeの特徴 |
---|
| 148 | 日本で流行っていない |
---|
| 149 | 802.15.4と混同される |
---|
| 150 | BluetoothやWiFiに押され気味 |
---|
| 151 | 年会費高い |
---|
| 152 | etc... |
---|
| 153 | ZigBeeの歴史 |
---|
| 154 | ZigBee 2004とZigBee 2006は互換性がない |
---|
| 155 | 今年 ZigBee IPが出た |
---|
| 156 | ZigBee三大要素 |
---|
| 157 | IEEEで決まっているのはPHYとMACで決まっている (802シリーズ) |
---|
| 158 | それより上はアライアンスで決めた |
---|
| 159 | NWK |
---|
| 160 | この層がZigBeeとしてもっともよく知られた層 |
---|
| 161 | APL |
---|
| 162 | この層が全然理解されていない (後方互換性が無いのはここ) |
---|
| 163 | APS, ZDO, ZCL |
---|
| 164 | 802.15.4とは |
---|
| 165 | IEEEが策定したPAN標準 |
---|
| 166 | 802.15.1 -> Bluetooth |
---|
| 167 | 802.15ワーキンググループ (WPAN) |
---|
| 168 | 別名Low Rate WPAN |
---|
| 169 | 速度を犠牲にして消費電力を減らす |
---|
| 170 | 2.4GHz |
---|
| 171 | NWK Layer |
---|
| 172 | メッシュを実現している層 |
---|
| 173 | ルーティング・ネットワークの管理 |
---|
| 174 | どのようなネットワークトポロジーになっているかはあまり重要ではない |
---|
| 175 | 世の中に出回っているのはほとんどZigBee Pro |
---|
| 176 | 毎回ルーティングを探す |
---|
| 177 | NLDE |
---|
| 178 | ふつうのData Entity |
---|
| 179 | フレーム作ってセキュリティ掛けたり |
---|
| 180 | NLME |
---|
| 181 | ネットワークの開始・参加・離脱 |
---|
| 182 | PAN IDの管理 |
---|
| 183 | ルート探索 |
---|
| 184 | ルーティング |
---|
| 185 | ZigBee Network |
---|
| 186 | Coordinator |
---|
| 187 | Router |
---|
| 188 | EndDevice -> 電気を食わない |
---|
| 189 | Coordinator |
---|
| 190 | ネットワークに常に一台しか居ない |
---|
| 191 | 802.11におけるAPのようなもの |
---|
| 192 | 常にOn -> スリープ出来ない |
---|
| 193 | 基本的にPCだったりして、ゲートウェイ的働きをする |
---|
| 194 | Router |
---|
| 195 | ネットワークを作成出来ない他はCoordinatorと同じ |
---|
| 196 | EndDevice |
---|
| 197 | ネットワークを作成出来ない |
---|
| 198 | 子ノードを持つことが出来ない |
---|
| 199 | ルーティング出来ない |
---|
| 200 | 通常はスリープ状態 |
---|
| 201 | 普段はメッセージを受信することが出来ない |
---|
| 202 | Coordinator/RouterからEndDeviceにメッセージを投げると、直接届いているように見える |
---|
| 203 | 実はメッセージは親を経由する |
---|
| 204 | EndDeviceはスリープから復帰した時、自分で取りに行く |
---|
| 205 | メールチェックのような仕組み |
---|
| 206 | 宛先のEndDeviceが取りに来なかったら、無慈悲に削除される |
---|
| 207 | デフォルトタイムアウトは7680ms |
---|
| 208 | 何とかしてすぐに送りたい |
---|
| 209 | たぶんWakeupボタンみたいなのがあるはず |
---|
| 210 | Wakeupボタンを押すと… |
---|
| 211 | DoSのように何度も読みに行くだけ |
---|
| 212 | FAQ |
---|
| 213 | 消費電力について |
---|
| 214 | Coordinator/Routerは常にRXはON |
---|
| 215 | 電池がどんどん減る |
---|
| 216 | 極力スリープ状態を長くすることでしか解決出来ない |
---|
| 217 | Wakeupを5分毎くらいにすると、半年くらいは電池が持つようになる |
---|
| 218 | PANIDが2つ(?) |
---|
| 219 | 16-bit PANID |
---|
| 220 | MACアドレスで使われるネットワーク識別ID |
---|
| 221 | アドレスが二つ? |
---|
| 222 | IEEE adressとNetwork address |
---|
| 223 | IEEE -> いわゆるMAC adress (64bit) |
---|
| 224 | Network adress IPスタックにおけるIPアドレスのようなもの |
---|
| 225 | APL Layer |
---|
| 226 | アプリケーション層 |
---|
| 227 | ZigBee最大の特徴 |
---|
| 228 | APS、Application Framework (ZDO/ZCL)の二つに分かれている |
---|
| 229 | アプリケーションフレームワークがプロトコルレベルで決まっている |
---|
| 230 | ZigBeeは単なる「通信方式の一つ」ではない |
---|
| 231 | ビジネスに直結する仕様が策定されている |
---|
| 232 | アライアンスの存在意義 |
---|
| 233 | モダンな設計 |
---|
| 234 | オブジェクト指向の概念がふんだんに取り入れられている |
---|
| 235 | APS Layer |
---|
| 236 | 上位のフレームワーク層と直接やりとりする層 |
---|
| 237 | Binding, Group Management, etc... |
---|
| 238 | Endpoint毎にユーザのアプリケーションが格納される |
---|
| 239 | Binding |
---|
| 240 | あるApplication Objectと別のそれをリンクする |
---|
| 241 | 単一方向 |
---|
| 242 | 多重バインディング |
---|
| 243 | Binding Table |
---|
| 244 | Group Addressing |
---|
| 245 | 複数のApplication Objectに対して一括送信したい |
---|
| 246 | 基本的にブロードキャスト、受信側が責任を持ってフィルタする |
---|
| 247 | Group Table |
---|
| 248 | APS ACK |
---|
| 249 | 信頼性を高める |
---|
| 250 | ACKタイムアウト時に再送 |
---|
| 251 | Fragmentation |
---|
| 252 | 名の通りデータのフラグメント化 |
---|
| 253 | 実装されていないこともある |
---|
| 254 | ウィンドウサイズがあったりと、TCPに似ている |
---|
| 255 | Security |
---|
| 256 | これだけで仕様書別になっているので、今回は省略 |
---|
| 257 | Application Framework |
---|
| 258 | Cluster |
---|
| 259 | 「機能」を指し示すような概念 |
---|
| 260 | Application Objectが外部にどのような機能を提供するか |
---|
| 261 | Application Objectには必ずClusterが一つ以上ある |
---|
| 262 | ZCLにおいては「クラス」に近い概念 |
---|
| 263 | Profile |
---|
| 264 | Clusterの集まりを定義 |
---|
| 265 | クラスに対するパッケージに近い概念 |
---|
| 266 | APSメッセージはCluster IDとProfile IDを指定する必要がある |
---|
| 267 | ZigBee Device Object |
---|
| 268 | USBのEndpoint0と似ている |
---|
| 269 | Application Objectの実装 |
---|
| 270 | ZDOとZDPは違う概念 |
---|
| 271 | ユーザが作成するApplication Objectは通常APSDE以外触れることが出来ない |
---|
| 272 | サンドボックスの様な仕組み |
---|
| 273 | 別途ZDOを経由する |
---|
| 274 | ZigBee Cluster Library |
---|
| 275 | ユーザが作成するApplication Objectの実質的な仕様、枠組み |
---|
| 276 | 必ずサーバとクライアントが対になって通信しなければいけない |
---|
| 277 | Profile固有のClusterと共通のClusterが存在する |
---|
| 278 | ZigBee IP |
---|
| 279 | つまらないので省略 |
---|
| 280 | Pure Java ZigBee Application Framework: Bekko (LGPL) |
---|
| 281 | アライアンス入会とは? |
---|
| 282 | ZigBeeを名乗るプロダクトを開発する権利 |
---|
| 283 | HAやSE等PAPプロダクトを開発する権利 |
---|
| 284 | ただし、非営利目的であれば入会不要 |
---|
| 285 | 営利目的であっても既に認定を受けたプロダクトを利用するだけなら入会不要 |
---|
| 286 | XBeeは入会不要 |
---|
| 287 | Q/A |
---|
| 288 | 有名なプロダクト例 |
---|
| 289 | 日本で市販はされていない |
---|
[207] | 290 | BluetoothやWiFiとは違い、B2Bが目的なので、コンシューマ向けではない |
---|
[206] | 291 | アメリカにおいては、Control4Cが、「一戸建て建てる時にZigBee組み込みませんか」みたいなキャンペーンはしている |
---|
| 292 | 蛍光管をLEDに代える際に、ZigBee組込みで、配線無しでOn/Off出来る製品とか |
---|
| 293 | 日本ではMAKEというイベントに行けば見れるかも |
---|
| 294 | |
---|
| 295 | |
---|
[208] | 296 | @fusioniojp |
---|
| 297 | FUSION-IO関連の楽しいお話 |
---|
| 298 | IOMEMORY SDKとNVMインターフェース |
---|
| 299 | Non Volatile Memory |
---|
| 300 | NANDフラッシュメモリとDMAコントローラを一体にしたもの |
---|
| 301 | |
---|
| 302 | 現行 |
---|
| 303 | NANDとメインメモリの間にI/Fのコントローラが挟まっていて、遅い |
---|
| 304 | SASコントローラなど |
---|
| 305 | これから (カットスルーアーキテクチャ) |
---|
| 306 | FPGAで実装されているデータバスコントローラを使う |
---|
| 307 | メインメモリに直接コピーされる |
---|
| 308 | 512byte -> 10usで書ける |
---|
| 309 | HPCではデータをHDD上に置かない |
---|
| 310 | SSDが出てきた時、「NANDはメモリなんだから、メモリのようにI/O出来るようにすべきだ」 |
---|
| 311 | 不揮発メモリであれば、BlockI/Oでは実現出来ないような操作が可能 |
---|
| 312 | BlockI/Oは回転型メディアにあわせて設計されている |
---|
| 313 | テープ |
---|
| 314 | open/read/write/rewind |
---|
| 315 | ディスク |
---|
| 316 | open/read/write/seek |
---|
| 317 | SSD |
---|
| 318 | ディスクと同じ様にあえてしている |
---|
| 319 | Trimとかは一応あるが…… |
---|
| 320 | ioMemory NVM |
---|
| 321 | 不揮発メモリの特性を生かした追加機能 |
---|
| 322 | 通常のライト+アトミックライト・条件付きライト |
---|
| 323 | ジャーナル要らなくね? |
---|
| 324 | 通常のライト+TTLライト(のちに自動消去) |
---|
| 325 | このデータは自動的に消滅する |
---|
| 326 | mmap+クラッシュセーフ・バージョニング |
---|
| 327 | 先ほどのftraceの様にどんどんログを書き込む |
---|
| 328 | SSDの登場により、フラッシュメモリを使ったアプリケーションが実現した |
---|
| 329 | フラッシュメモリをメモリとして利用すると、ソフトウェア開発のあり方が変化する |
---|
| 330 | 現行 |
---|
| 331 | アプリケーション -> BlockI/O、ネットワークファイル |
---|
| 332 | これから |
---|
| 333 | アトミックI/O |
---|
| 334 | トランザクション |
---|
| 335 | ユーザ定義のオブジェクトによりトランザクション |
---|
| 336 | Key-Valueトランザクション |
---|
| 337 | memcached |
---|
| 338 | 将来 |
---|
| 339 | 高速なロギング |
---|
| 340 | チェックポイントメモリ |
---|
| 341 | メモリトランザクション |
---|
| 342 | CPUからメモリに書き込むように、フラッシュメモリに書き込める |
---|
| 343 | 100万IOPSのカードは既に実現している |
---|
| 344 | CPUのコンテキストスイッチの方が問題になってくる |
---|
| 345 | -> mmaped I/Oすれば良いのでは |
---|
| 346 | 64byte/1thread -> 960万回 |
---|
| 347 | スパースアドレス空間 |
---|
| 348 | デバイスI/Fのオープン化と、OSS |
---|
| 349 | directFS |
---|
| 350 | NVM APIライブラリ |
---|
| 351 | Atomic writeはSCSI標準化に向けてプロポーザルを出した |
---|
| 352 | ハードウェア側で書き込みを保証出来るので、アプリケーションとしては単に「書き込む」だけで良い |
---|
| 353 | MySQLのダブルバッファーのようなことは必要なくなる |
---|
| 354 | 書き込み量が減るので、製品の寿命も長くなって良い |
---|
| 355 | 書き込みの粒度を512byteから小さくすれば、一回の書き込みに掛かる時間は短くなる |
---|
| 356 | directFS |
---|
| 357 | swap -> Extended memory |
---|
| 358 | |
---|
| 359 | Q/A |
---|
| 360 | ウェアレベリングなどはどこで行われているか |
---|
| 361 | CPU側で行っている |
---|
| 362 | SSDのような小さなデバイス上に実装されているマイコンで行われるのを待ってCPUが |
---|
| 363 | ブロッキングされるより、CPUで行った方が結果として早かったりする |
---|