Linux上での計算系プログラムの性能計測のための知識とツールまとめ
アプリケーションの性能最適化ツール等のまとめとリンク集です.随時更新していきたいと思っています.
私の専門分野の関係上,計算をガリガリするプログラムを対象としたものが多く,通信やWebサーバーのチューニング系は少なめです.
TL;DR(時間のない人へ)
とりあえずこの2つだけ嫁
Velocity 2015 linux perf tools
Linux Performance Profiling and Monitoring
まとめ・ノウハウ系資料
システムのパフォーマンスを改善する上で,どのコマンド/ツールをどう使えばよいか, どのようなアプローチが有効か,などの説明をしているページや動画等をまとめています.
Brendan Gregg氏の資料
Brendan Gregg氏は,perf-tools,やFlame Graphというツールの開発者であり,Netflixのエンジニアです.性能測定関係の情報を探していると,かならずGregg氏の資料にぶつかります.
- Linux Performance Analysis: New Tools and Old Secrets
- USENIX/LISA'14 というカンファレンスで発表された資料と講演ビデオへのリンク
- The Netflix Tech Blog: Linux Performance Analysis in 60,000 Milliseconds
- いろんなツールのまとめです.Netflix社のブログですが,書いているのはGregg氏
- Velocity 2015 linux perf tools
- どのように性能チューニングを進めていけばいいのか,という方法論が述べられ,その後に各ツールの使い方が述べられていきます.すさまじい数のツールの紹介
- Linux Performance
- Gregg氏自身による資料のまとめとポインタ
4つ目のページには,OS(Linux)の構成要素と対応する計測ツールが図にまとめられています(下図は縮小したもの).これを見ればこのエントリいらないんじゃないかな(提案
その他
- 書籍
- Performance Tuning Guide
- Redhat社のマニュアル.英語だし量が多いので気合が必要
- Performance Tuning Guide
- Redhat社のマニュアル第二弾
- Linux Performance and Tuning Guidelines (PDF, 約150ページ)
- Lenovo(旧IBM)の資料で,Linuxの仕組みの解説からチューニングの方法まで,網羅的に書かれたドキュメントです
- Extreme Linux Performance Monitoring and Tuning
- 性能を阻害する要因にはどのようなものがあるのか,Linuxのプロセス管理の方法の整理.
vmstat
,mpstat
,top
,ps
などのコマンドの出力をどう解釈するか.
- 性能を阻害する要因にはどのようなものがあるのか,Linuxのプロセス管理の方法の整理.
- Measuring Execution Time and Real-time Performance: Part 1 | Dr Dobb's
- 組み込み・リアルタイムシステムを対象とした性能計測.計測に使う関数の正確度(accuracy)解像度(Resolution)の話,何を計測するためにどのツールを使うべきか.
- キーワード:timeコマンド,gprof,clock(),
- 大きなテキストファイルをawkで処理するときにcatで投げ込むと速い理由 - ablog
- 続編→ ”私の環境で”大きなテキストファイルをawkで処理するときにcatで投げ込むと速い理由 - ablog
- 続続編→ プロセスのランキュー待ち時間とI/O待ち時間を調べる - ablog
awk file
に比べてcat file|awk
の方が速いという現象が発生した際の原因追跡をされた記事です.データがパイプによって渡されていることによって,間にバッファが作られ,catのIOとawkの計算の間でオーバーラップが行われるので速くなるのでは?という仮説をもとに検証されています.- 言及されているツール:/proc/sys/vm, strace, perf, Flame Graphs, top, taskset,
- How profilers lie: the cases of gprof and KCachegrind
- プロファイラというものは,常に正しい測定結果を返すわけではありません.gprofなどのプロファイラツールが,どのような時になぜ間違うのかを説明しています.
- キーワード:callgrind, cachegrind, gprof
- Linux Performance Profiling and Monitoring
- 大量のコマンドの使い方が図や用例と主に紹介.おすすめ.
- キーワード: Sysstat, dstat, nistat, /proc, sar, sadc, top, htop, iotop, iftop, perf_events, ftrace, perf-tools, Flame Graphs
- c++ - How to determine CPU and memory consumption from inside a process? - Stack Overflow
- メモリの使用量をCプログラムから取得する方法がWindows, Linux, Macごとにまとめられています.
背景知識・前提知識・お勉強編(用語がわからない人へ)
- Latency Numbers Every Programmer Should Know · GitHub
- What every programmer should know about memory :有名論文.
- 東大の田浦先生のOSの授業資料
- 「オペレーティングシステム論」の講義資料・ノートPDF。OSのプロセス管理やメモリ管理,ファイルシステムを勉強 - 主に言語とシステム開発に関して
- OSの基礎について言及した本が何冊か:
- Help! Linux ate my RAM!
- Linux上で,「used」となっているメモリの意味.続きのページでは,実際にC言語でプログラムを書いて挙動を観察する実験.
- キーワード:free, /proc/sys/vm
個別コマンド・ツール編
上記「ノウハウ編」で登場したコマンドの個別の使い方や結果の解釈の仕方などを説明したページへのリンクを集めました.おおまかに,高レベル(OSレベル)→低レベル(CPU命令レベル)の順に並んでいます.リンクがないところは書いてる途中ですが,個別のツールについてはググればすぐに資料が見つかるので不要かもしれません.
- Broken Linux Performance Tools 2016
- たびたび登場するBrendan Greggさんの資料.各ツールの落とし穴.
- キーワード:load averageの意味,top,free,vmstat,netstat,cachestat,perf,perf_events, tcpdump, valgrind, /proc/stat の解釈の仕方など.
- free
- ps
- Virtual Threads: Understanding memory usage on Linux
- KEditというアプリケーション(KDEのメモ帳)が25MBもメモリを食っている(ように見える)のはなぜか,という話を題材に,psが表示する数値の意味を説明しています.
- Virtual Threads: Understanding memory usage on Linux
- vmstat
- /proc
- pidstat
- top/htop
- TAU, Vampir Trace, Open|Speedshop, scalasca (スパコン向け性能解析ツール)
- oprofile
- google-perftools
- perf_tools
- Flame Graph
- Valgrind / cachegrind
- RDTSC命令
- PAPI
std::tupleとstd::tieを使って複数の配列を一緒にソートする(配列の構造体 SoA のソート)
互いに関連付けられた複数の配列を一緒にソートしたい場合があります.
// SoAの例 std::vector<int> student_ids; std::vector<std::string> names; std::vector<int> math_scores; // AoSの例 struct Student { int id; std::string name; int math_score };
専門的には,SoA(Structure of Array:配列の構造体)と呼びます(かならずしも構造体とはなっていなくても).一方,普通に構造体やクラスの配列になっている場合はAoS(Array of Structure:構造体の配列)と呼ばれます.
さて,このSoAのデータ構造をソートしたいと思います.上の例で言いうと,生徒番号を元に名前などのフィールドを一斉にソートしたいということです.最初からAoSを採用すれば余計な苦労はありませんが,歴史的な事情や効率の都合でSoAになっているとします.
そこで,C++11のstd::tuple
を使って,SoAを内部的にAoSに変換してソートする関数を書いてみました.ポイントは,std::tie
を使うとPythonの一括代入のようなことができるという点ですね.これは調べるまで知りませんでした.
template<class T, class...Args> void TiedSort(std::vector<T> &a, std::vector<Args>&... args) { using tt = struct { T key; std::tuple<Args...> val; }; std::vector<tt> vals(a.size()); for (size_t i = 0; i < a.size(); i++) { vals[i].key = a[i]; vals[i].val = std::make_tuple(args[i]...); } std::sort(std::begin(vals), std::end(vals), [](const tt& a, const tt& b) { return a.key < b.key; }); for (size_t i = 0; i < a.size(); i++) { a[i] = vals[i].key; std::tuple<Args&...>(args[i]...) = vals[i].val; } } int main() { std::vector<int> student_ids = {3,2,5,1,4}; std::vector<double> weights = {42.3, 34.6, 32.5, 51.2, 41.7}; std::vector<double> heights = {1,1,1,1,1}; TiedSort<int, double, double>(student_ids, weights, heights); }
なお,SoAをソートする方法としては,インデックス配列を用意してそれをソートする方法(数学で言う置換:permutationを使う)方法もありますが,これだと一時領域が必要になりコピーのコストが増大するため低速でした.そのうちPAPIとかを使ってきっちり評価したいとは思いますが.
- 作者: επιστημη,高橋晶
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/04/17
- メディア: 単行本
- この商品を含むブログ (6件) を見る
2016/07/16 時点 Intel Xeon Phi の新製品Knights Landingについてのリンク集
自分用のリンク集です.
Knights Landingの出荷が始まっているようです.前世代のKnights Cornerで問題となったリングバスは取り除かれ,メッシュネットワークで置き換えられているようなので,性能評価が出てくるのが楽しみです
Intelのオフィシャルページ.スペック等
Intel® Xeon Phi™ Product Family
Intel Xeon Phi Processor High Performance Programming, Second Edition: Knights Landing Edition(オフィシャル解説本)
後藤弘茂さんによる安定の解説
後藤さんの記事は,きちんと基礎知識がないと理解すらおぼつきません.
Intelは機械学習で覇権を握れるか? ~GPGPUに対するXeon Phiの優位点を語る - PC Watch
【後藤弘茂のWeekly海外ニュース】Intelのサーバー戦略の要となるXeon PhiとFPGA - PC Watch 2016/7/6
【後藤弘茂のWeekly海外ニュース】ホモジニアスな構成が可能な新生Xeon Phi「Knights Landing」の強味 - PC Watch 2016/7/5
【後藤弘茂のWeekly海外ニュース】Intelがスパコンカンファレンスで「Knights Landing」を正式発表 - PC Watch 2016/6/22 @ ISC
信頼と実績のHPC Wire
Intel Launches 'Knights Landing' Phi Family for HPC, Machine Learning 2016/6/21 @ISC
What Knights Landing Is Not 2016/6/18
Intel Debuts 'Knights Landing' Ninja Developer Platform 2016/4/12
A Conversation with James Reinders 2016/1/21
The Next Platform
Intel Knights Landing Yields Big Bang For The Buck Jump 2016/6/20
マイナビ
米Intel、"Knights Landing"こと最大72コアの次世代「Xeon Phi」 | マイナビニュース 2016/6/22
その他
Intel talks concurrency and Knights Landing • The Register 2015/12/16