SlideShare a Scribd company logo
Linux カーネルの読み方 Naoya Ito
担当章 リバース  proxy キャッシュ Linux Web サーバー
Linux  カーネルを読む 「よーし、Linux カーネル読むぞー」
早速カーネルを読む ! 「なんと かわいい バイナリ」 「0x000000c4 は 俺の嫁 」 「いやいや、そこは 0x0000006d でしょう? なおや 氏 」
...  という話ではなく Linux  カーネルの読み方 Linux カーネルの ソースコード の読み方
お話したいこと Linuxカーネルを読む カーネルのソースを読んで良かったこと Linux カーネルに触れたきっかけ カーネルソースの読み方
カーネルのソースを 読んで良かったこと
以前の私 #1 負荷が過剰 「このサーバーはディスクが 重そう 」 (実際どこが正確な原因なんだろう...) (そもそも"負荷"って何だろう...)
以前の私 #2 load average が 10.00 「 Google  で調べると CPU数で割って 1.00 以下なら OK らしい。」 (なんでCPU数で割るんだろう...) (そもそも load average って何だ...)
以前の私 #3 Apache がアクセス過多 「prefork から worker にすればマルチスレッドになって 速くなるかも 」 (なんでスレッドだと速いのかしら...) (とりあえず収まったから良いか...)
以前の私 #4 I/O が高くてディスクがもたない 「サーバー増やしてみる? SCSI のディスクに 変えてみよう か」 (I/O ってどうやったら減らせるの...?) ( SCSI にしたところで大して速くならない...)
根拠がない 重そう Googleで調べると 速くなるかも 変えてみよう 根拠がないので対症療法しか取りようがない
現在の私 #1 負荷が過剰 OS の出力する統計情報から原因を特定 load average が 10.00 load average を上昇させるプロセスを特定 プロセスの挙動からボトルネックを特定
現在の私 #2 Apache がアクセス過剰 なぜ応答を返せないか原因を統計から特定 プロセス or スレッドは両者の差異点がどこかを考慮して選択 I/O が高くてディスクが持たない I/O 分散計画をキャッシュを前提に立てる
カーネルのソースに触れたことで OS  の動作原理や統計情報の意味をソースコードレベルで理解することができた 根拠を持って負荷分散戦略を立てられるようになった スケーラブルなアプリケーション設計に自信が持てるようになった 抽象レイヤが透けて見える
結果 『サーバー/インフラを支える技術』執筆
Linux  カーネルに 触れたきっかけ
バイナリアンになりたくて
苛立ち ローレイヤのことが分からない 分かりたい 何に手をつけて良いかが分からない
きっかけ
Linux カーネル本の概論を読んだ 3版発売決定 2版をずっと「積ん読」にしていた せっかく買ったしこのままお蔵入りも勿体ない。 1 章だけでも読んでみるか ...
知りたかったことが書かれていた プロセスとは何か スレッドとは何か 仮想メモリとは何か ファイルがどうキャッシュされるか システムコールの裏側
ソースを開く load average とは何かを調べる 半端無く難しいと思い込んでいた 書籍片手に  grep  したら意外と分かった
Linux  カーネルの設計 モノリシックカーネル 複雑な設計パターンはあまりない ややオブジェクト指向 (VFS など) ただし量は多い ... 500Mステップ
カーネル開発者に感謝 ソースコードの裏には幾多の試行錯誤 開発者 >>>> ソース読者 素晴らしい学習教材に感謝
カーネルソースの読み方 俺流
使っている道具 GNU Emacs GNU GLOBAL ( gtags ) App::Ack ( ack ) 書籍数冊 紙とペン
Emacs
GNU GLOBAL ソースコードタグシステム 関数の定義場所、呼び出し場所にジャンプ Emacs と連携 if (likely(prev != next)) { rq->nr_switches++; rq->curr = next; ++*switch_count; context_switch (rq, prev, next); } else { ... sched.c 3517 行目 sched.c 1860 行目 static inline void context_switch (...) { struct mm_struct *mm, *oldmm; prepare_task_switch(rq, prev, next); mm = next->mm; ..
App::Ack grep よい良いソースコード検索ツール % sudo cpan App::Ack
書籍数冊 別の書籍の同テーマの解説を読む
紙とペン 処理の流れをメモしながら進める コールスタックが深いと迷子になりやすい
Linux Kernel Hack Japan http://hira.main.jp/wiki/index.php " ひら " さんによる膨大な覚書き ひらメソッド 分からない時のヒントに
ソースを読む 5 つのコツ 読む対象を絞る いきなり読まない 概観を知った上で読む 重要なデータ構造を把握する テストプログラムのトレースを活用する
1.  読む対象を絞る 隅々まで読もうとしない 500Mステップも読めない (自分もまだ数 % です) テーマを決めて読む 「load average の計測方法を調べる」 「コンテキストスイッチの仕組みを調べる」 「 select(2)  の実装を調べる」
2.  いきなり読まない まず全体を把握する ソースツリーの構造 本の目次を読むのと同じ
3.  概観を知った上で読む 書籍で知りたい箇所の概観を掴む スケジューラの概要 ... ふむふむ、なるほど -> ソース読む 大枠が分かっていれば迷子にならない
4.  重要なデータ構造を把握しておく 重要なデータ構造 struct task_struct struct mm_struct   VFS の  struct file_operations ...
5.  テストプログラムを活用 例: スレッド生成周りの処理が知りたい pthread_create()  するプログラムを作る プログラムを  strace  する システムコールの呼ばれ方 -> 実装箇所の当たりが付く
例 : usleep(3)  の精度が知りたい http://d.hatena.ne.jp/naoya/20080122 まずテストプログラムで実験 strace   で  nanosleep(2)   の呼び出しを確認 書籍の索引で  nanosleep   を引く タイマ割り込み周りの章を読む タイマ割り込み周りのコードの当たりがつく ack  や  GNU GLOBAL  を駆使して  sys_nanosleep()   の実装 / 周辺を芋づる式に調べていく  ( 道筋の記録を忘れずに ) nanospeel(2)  の母体になっている動的タイマが割り込み周期に依存していることが分かる ->  4ms
読んで分かった必要な知識 C言語 gcc 拡張 GNU開発ツール CPU の機能 (x86) オブジェクト指向 簡単なパターン (Template Method など) Writing a Simple File System http://www.geocities.com/ravikiran_uvs/articles/rkfs-old.html
番外編 手を動かしたい方は ... カーネルモジュール開発が面白い http://d.hatena.ne.jp/naoya/20071201 フィボナッチ数列を計算するデバイス  ( アホ ) % cat /proc/fib 10 % cat /dev/fib 55
まとめ 巨大なソースに当たるにはコツがあります 堀から埋めていきましょう カーネルのソースを読むと負荷分散に強くなります。自信が持てます カーネルのソースを読むことでOSの動作原理を知ることができます
最後に カーネル? 何の役に立つの? 「ただ知りたかった」 カーネルへの興味が負荷分散に繋がるとは思っていなかった 役に立つかどうかは知らなければ分からない。 知りたいと思う動機を大切に。
Thank you!

More Related Content

What's hot (20)

PDF
今話題のいろいろなコンテナランタイムを比較してみた
Kohei Tokunaga
 
PDF
MySQL負荷分散の方法
佐久本正太
 
PPTX
GitLab から GitLab に移行したときの思い出
富士通クラウドテクノロジーズ株式会社
 
PPTX
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
NTT DATA Technology & Innovation
 
PDF
ゲームエンジンとMVC
AimingStudy
 
PDF
Observableで非同期処理
torisoup
 
PDF
失敗事例で学ぶ負荷試験
樽八 仲川
 
PDF
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Yuichi Ito
 
PDF
.NET Core時代のCI/CD
Yuta Matsumura
 
PDF
20191009 AWS Black Belt Online Seminar Amazon GameLift
Amazon Web Services Japan
 
PDF
Reactive extensions入門v0.1
一希 大田
 
PDF
ドメイン駆動設計をゲーム開発に活かす
増田 亨
 
PDF
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
 
PDF
Kubernetesによる機械学習基盤への挑戦
Preferred Networks
 
PDF
UniTask入門
torisoup
 
PDF
PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~
Masamichi Hosoda
 
PPT
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
 
PDF
Linux女子部 systemd徹底入門
Etsuji Nakai
 
PDF
HTTP入門
Sota Sugiura
 
今話題のいろいろなコンテナランタイムを比較してみた
Kohei Tokunaga
 
MySQL負荷分散の方法
佐久本正太
 
GitLab から GitLab に移行したときの思い出
富士通クラウドテクノロジーズ株式会社
 
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
NTT DATA Technology & Innovation
 
ゲームエンジンとMVC
AimingStudy
 
Observableで非同期処理
torisoup
 
失敗事例で学ぶ負荷試験
樽八 仲川
 
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Yuichi Ito
 
.NET Core時代のCI/CD
Yuta Matsumura
 
20191009 AWS Black Belt Online Seminar Amazon GameLift
Amazon Web Services Japan
 
Reactive extensions入門v0.1
一希 大田
 
ドメイン駆動設計をゲーム開発に活かす
増田 亨
 
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
 
Kubernetesによる機械学習基盤への挑戦
Preferred Networks
 
UniTask入門
torisoup
 
PDFのコピペが文字化けするのはなぜか?~CID/GIDと原ノ味フォント~
Masamichi Hosoda
 
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
 
Linux女子部 systemd徹底入門
Etsuji Nakai
 
HTTP入門
Sota Sugiura
 

Viewers also liked (20)

ODP
Linuxカーネル超入門
Takashi Masuda
 
PDF
2章 Linuxカーネル - メモリ管理1
mao999
 
PDF
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
Naoya Ito
 
ODP
Hadoop for programmer
Sho Shimauchi
 
PPTX
今さら聞けないHadoop セントラルソフト株式会社(20120119)
Toru Takizawa
 
PDF
20130126 sc12-reading
Toshiya Komoda
 
PDF
バイナリアンを目指して For a binaryen
Eyes, JAPAN
 
PDF
ただいまHadoop勉強中
Satoshi Noto
 
PDF
Naoya Tsuruta
Suurist
 
KEY
ソーシャルゲームログ解析基盤のHadoop活用事例
知教 本間
 
PDF
Hadoopを40分で理解する #cwt2013
Cloudera Japan
 
PDF
Web関連技術の最新動向・プログラミング言語(サーバ側)
masayoshi takahashi
 
PDF
aisatsu suruto tomodachiga popopoponnto hueruyo
show you
 
PDF
TomonkenTohoku40th(20150125)
真 岡本
 
PPT
CA Japan seminar mainframe2.0 2011/10/26
Kaneko Izumi
 
PPTX
レジリエンス・コーチング
Keita Kiuchi
 
PPT
シンプル資産運用法
renny_29
 
PPT
ファイルシステム
Yohei Tanaka
 
Linuxカーネル超入門
Takashi Masuda
 
2章 Linuxカーネル - メモリ管理1
mao999
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
Naoya Ito
 
Hadoop for programmer
Sho Shimauchi
 
今さら聞けないHadoop セントラルソフト株式会社(20120119)
Toru Takizawa
 
20130126 sc12-reading
Toshiya Komoda
 
バイナリアンを目指して For a binaryen
Eyes, JAPAN
 
ただいまHadoop勉強中
Satoshi Noto
 
Naoya Tsuruta
Suurist
 
ソーシャルゲームログ解析基盤のHadoop活用事例
知教 本間
 
Hadoopを40分で理解する #cwt2013
Cloudera Japan
 
Web関連技術の最新動向・プログラミング言語(サーバ側)
masayoshi takahashi
 
aisatsu suruto tomodachiga popopoponnto hueruyo
show you
 
TomonkenTohoku40th(20150125)
真 岡本
 
CA Japan seminar mainframe2.0 2011/10/26
Kaneko Izumi
 
レジリエンス・コーチング
Keita Kiuchi
 
シンプル資産運用法
renny_29
 
ファイルシステム
Yohei Tanaka
 
Ad

Similar to How to read linux kernel (20)

PDF
スタート低レイヤー #0
Kiwamu Okabe
 
PDF
プロセスとコンテキストスイッチ
Kazuki Onishi
 
PDF
OpenFlowをXenServerで試してみよう
Kimihiko Kitase
 
PPT
Open VZ
Kazuaki Fujikura
 
PDF
Node.js入門
俊夫 森
 
PDF
Linux Kernel Seminar in tripodworks
tripodworks
 
PDF
密着!わたしのコンソールアプリ開発環境
Fumihito Yokoyama
 
PDF
PaaSの作り方 Sqaleの場合
hiboma
 
PDF
OpenContrailのソースコードを探検しよう!
Takashi Sogabe
 
KEY
Fabricでサーバー管理をDRYにしよう
max747
 
PDF
debugging server with strace
Yoshinari Takaoka
 
PPT
ZFSのソースコードをチラ見してみる
Koichi Suzuki
 
PDF
インフラエンジニアがk8sでアプリを作って見えた今後のインフラ
susumu tanaka
 
PDF
IaaSクラウドを支える基礎技術 演習編_v1_0
Etsuji Nakai
 
PDF
【学習メモ#11th】12ステップで作る組込みOS自作入門
sandai
 
PPTX
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
Preferred Networks
 
PDF
kernel/vm@okinawa 2014
y0t4
 
PDF
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
Yuto Takei
 
PDF
IIJlab seminar - Linux Kernel Library: Reusable monolithic kernel (in Japanese)
Hajime Tazaki
 
PDF
オペレーティングシステム 第1回-公開用
Ruo Ando
 
スタート低レイヤー #0
Kiwamu Okabe
 
プロセスとコンテキストスイッチ
Kazuki Onishi
 
OpenFlowをXenServerで試してみよう
Kimihiko Kitase
 
Node.js入門
俊夫 森
 
Linux Kernel Seminar in tripodworks
tripodworks
 
密着!わたしのコンソールアプリ開発環境
Fumihito Yokoyama
 
PaaSの作り方 Sqaleの場合
hiboma
 
OpenContrailのソースコードを探検しよう!
Takashi Sogabe
 
Fabricでサーバー管理をDRYにしよう
max747
 
debugging server with strace
Yoshinari Takaoka
 
ZFSのソースコードをチラ見してみる
Koichi Suzuki
 
インフラエンジニアがk8sでアプリを作って見えた今後のインフラ
susumu tanaka
 
IaaSクラウドを支える基礎技術 演習編_v1_0
Etsuji Nakai
 
【学習メモ#11th】12ステップで作る組込みOS自作入門
sandai
 
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
Preferred Networks
 
kernel/vm@okinawa 2014
y0t4
 
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
Yuto Takei
 
IIJlab seminar - Linux Kernel Library: Reusable monolithic kernel (in Japanese)
Hajime Tazaki
 
オペレーティングシステム 第1回-公開用
Ruo Ando
 
Ad

More from Naoya Ito (13)

PPT
Titanium Mobile
Naoya Ito
 
PPT
Scripting Layer for Android + Perl
Naoya Ito
 
PPT
Web-Gakkai Symposium 2010
Naoya Ito
 
PPT
はてなブックマークのシステムについて
Naoya Ito
 
PPT
Perlで圧縮
Naoya Ito
 
PPT
Introduction to Algorithms#24 Shortest-Paths Problem
Naoya Ito
 
PPT
090518computing Huffman Code Length
Naoya Ito
 
PPT
スペルミス修正プログラムを作ろう
Naoya Ito
 
PPT
Dijkstra Algorithm
Naoya Ito
 
PPT
OGC2009 はてなブックマークについて
Naoya Ito
 
PPT
081108huge_data.ppt
Naoya Ito
 
PPT
about Thrift
Naoya Ito
 
PPT
Introduction To Moco
Naoya Ito
 
Titanium Mobile
Naoya Ito
 
Scripting Layer for Android + Perl
Naoya Ito
 
Web-Gakkai Symposium 2010
Naoya Ito
 
はてなブックマークのシステムについて
Naoya Ito
 
Perlで圧縮
Naoya Ito
 
Introduction to Algorithms#24 Shortest-Paths Problem
Naoya Ito
 
090518computing Huffman Code Length
Naoya Ito
 
スペルミス修正プログラムを作ろう
Naoya Ito
 
Dijkstra Algorithm
Naoya Ito
 
OGC2009 はてなブックマークについて
Naoya Ito
 
081108huge_data.ppt
Naoya Ito
 
about Thrift
Naoya Ito
 
Introduction To Moco
Naoya Ito
 

Recently uploaded (8)

PDF
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
PDF
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
PDF
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
PDF
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
PDF
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
PDF
20250711_日本IBM ミドルウエア・ユーザー研究会(JIMUC)総会_中村会長資料.pdf
ChikakoInami1
 
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
 
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
20250711_日本IBM ミドルウエア・ユーザー研究会(JIMUC)総会_中村会長資料.pdf
ChikakoInami1
 

How to read linux kernel