SlideShare a Scribd company logo
5
Most read
9
Most read
14
Most read
2021/3/20
NTTデータ 技術統括本部 システム技術本部
デジタル技術部 インテグレーション技術担当
齊加匠
Deep Dive into the Linux Kernel
- メモリ管理におけるCompaction機能について
© 2021 NTT DATA Corporation 2
テーマ方針
compaction について調査
具体的には Linux Kernel のコードを読み解き,
実際にどのような処理を行っているか、工夫点などを調査、検証
使用した Linux Kernel のバージョンは 5.8.2
© 2021 NTT DATA Corporation 3
そもそも compaction とは
Fragmentationを緩和するための手法
Fragmentation
メモリに対して allocation と deallocation を繰り返すと,
メモリが「虫食い」状態になり、使用可能な連続した領域が
少なくなってしまう現象
© 2021 NTT DATA Corporation 4
仕組みの概要
LWN.net(左記)によると
引用:https://lwn.net/Articles/368869/
 以下の2つの探索を走らせる
1. 低位から高位へとmovable pagesを探索する処理
2. 高位から低位へとfree pagesを探索する処理
 2つの探索がぶつかると、探索をやめて、
movable pagesをfree pagesへ移動させる
以上の処理によって、fragmentationが解消される
※ここでいう”page”とは,physical pageのことであり,物理メモリを分割する単位の一つである
© 2021 NTT DATA Corporation 5
処理の工夫点
 memory isolation を行うことによって,
candidate のリストを作り,それを操作するよ
うにしている
 compaction処理中にページリストの主要な
ロックをつかみ続ける必要がなくなるため,性
能を向上させることができる
static unsigned long isolate_freepages_block(struct compact_control *cc,
unsigned long *start_pfn,
unsigned long end_pfn,
struct list_head *freelist,
unsigned int stride,
bool strict)
{
//略
for (; blockpfn < end_pfn; blockpfn += stride, cursor += stride) {
int isolated;
struct page *page = cursor;
//略
order = page_order(page);
isolated = __isolate_free_page(page, order);
if (!isolated)
break;
set_page_private(page, order);
total_isolated += isolated;
cc->nr_freepages += isolated;
list_add_tail(&page->lru, freelist);
//略
}
//略
}
mm/compaction.c
© 2021 NTT DATA Corporation 6
呼び出し関係
 compaction の処理はpage_alloc.c(pageの割り当てを行っている)から呼び出されている
© 2021 NTT DATA Corporation 7
movable pageを探す処理
static isolate_migrate_t isolate_migratepages(struct co
mpact_control *cc)
{
//略
for (; block_end_pfn <= cc->free_pfn;
fast_find_block = false,
low_pfn = block_end_pfn,
block_start_pfn = block_end_pfn,
block_end_pfn += pageblock_nr_pages) {
//略
low_pfn = isolate_migratepages_block(cc, low_pf
n,
block_end_pfn, isolate_mode);
//略
break;
}
//略
return cc-
>nr_migratepages ? ISOLATE_SUCCESS : ISOLATE_NONE;
}
mm/compaction.c
低位から高位へと movable pages を探索している
実際に実行する処理は
isolate_migratepages_block に実装されている
© 2021 NTT DATA Corporation 8
free pageを探す処理
static void isolate_freepages(struct compact_control *cc
)
{
//略
for (; block_start_pfn >= low_pfn;
block_end_pfn = block_start_pfn,
block_start_pfn -= pageblock_nr_pages,
isolate_start_pfn = block_start_pfn) {
unsigned long nr_isolated;
//略
nr_isolated = isolate_freepages_block(cc
, &isolate_start_pfn,
block_end_pfn, freelist, stride, fal
se);
//略
}
//略
}
mm/compaction.c
高位から低位へと free pages を探索している
実際に実行する処理は
isolate_freepages_block に実装されている
© 2021 NTT DATA Corporation 9
zoneをcompactする処理
static enum compact_result
compact_zone(struct compact_control *cc, struct capture_cont
rol *capc)
{
//略
while ((ret = compact_finished(cc)) == COMPACT_CONTINUE)
{
//略
switch (isolate_migratepages(cc)) {
//略
case ISOLATE_SUCCESS:
update_cached = false;
last_migrated_pfn = start_pfn;
;
}
err = migrate_pages(&cc-
>migratepages, compaction_alloc,
compaction_free, (unsigned long)cc, cc->mode,
MR_COMPACTION);
//略
}
//略
}
mm/compaction.c compact_finishedはcompact_scanners_met
を呼び出している.
(つまり,free pages scanner が movable
pages scanner より低位に行った場合,
止まるよう実装されている.)
isolate_migratepages が呼び出されている.
compaction_allocはisolate_feepagesを
呼び出している
© 2021 NTT DATA Corporation 10
pageをmigrateする処理
int migrate_pages(struct list_head *from, new_page_t get_new_page,
free_page_t put_new_page, unsigned long private,
enum migrate_mode mode, int reason)
{
//略
for(pass = 0; pass < 10 && retry; pass++) {
retry = 0;
list_for_each_entry_safe(page, page2, from, lru) {
retry:
//略
rc = unmap_and_move(get_new_page, put_new_page,
private, page, pass > 2, mode,
reason);
switch(rc) {
//略
case MIGRATEPAGE_SUCCESS:
nr_succeeded++;
break;
//略
default:
//略
nr_failed++;
break;
}
}
}
nr_failed += retry;
rc = nr_failed;
//略
return rc;
}
mm/migrate.c
10 回試す or movable pages がない
場合に return する
free pages に migrate している
(unmap_and_move)
© 2021 NTT DATA Corporation 11
まとめ
 compactionとはデフラグの手法である
 compactionの機能が実際にどう動作しているのか,カーネルのソース
コードレベルで把握することが出来た.(compactionの基本の原理自
体は既知だったが,実際にどのように動作しているのか解説した資料はな
かった)
 実装の工夫点としてはmemory isolatationを行うことで性能向上を
図っていることなどが分かった
© 2021 NTT DATA Corporation
本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。
© 2021 NTT DATA Corporation 13
学んだこと(kernel の読み方)
1. まずはざっくりとコメントを読んで当たりをつける
→コードの量が多いので,主処理がどこかを探して,それ以外を読み飛ばしていくことが肝要
2. メソッド名,変数名に着目して,処理内容を推測する
→気になった箇所については、その先を詳しく追う
3. コメントとソースコードの対応関係を見る
→if 文、ループ、break、goto 文などの処理に着目
© 2021 NTT DATA Corporation 14
学んだこと(kernel の読み方)具体例
/*
* Migrate an array of page address onto an ar
ray of nodes and fill
* the corresponding array of status.
*/
static int do_pages_move(struct mm_struct *mm,
nodemask_t task_nodes,
unsigned long nr_pages,
const void __user * __user *pages,
const int __user *nodes,
int __user *status, int flags)
{
//略
for (i = start = 0; i < nr_pages; i++) {
const void __user *p;
unsigned long addr;
int node;
//略
/*
* If the page is already on the targe
t node (!err), store the
* node, otherwise, store the err.
*/
err = store_status(status, i, err ? :
current_node, 1);
if (err)
goto out_flush;
err = move_pages_and_store_status(mm,
current_node, &pagelist,
status, start, i, nr_pages);
if (err)
goto out;
current_node = NUMA_NO_NODE;
}
out_flush:
/* Make sure we do not overwrite the exist
ing error */
err1 = move_pages_and_store_status(mm, cur
rent_node, &pagelist,
status, start, i, nr_pages);
if (err >= 0)
err = err1;
out:
return err;
}
mm/migrate.c

More Related Content

What's hot (20)

PDF
いまさら聞けない!CUDA高速化入門
Fixstars Corporation
 
PDF
不揮発メモリ(NVDIMM)とLinuxの対応動向について(for comsys 2019 ver.)
Yasunori Goto
 
PDF
10分で分かるLinuxブロックレイヤ
Takashi Hoshino
 
PDF
Magnum IO GPUDirect Storage 最新情報
NVIDIA Japan
 
PDF
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
 
PDF
CXL_説明_公開用.pdf
Yasunori Goto
 
PDF
initramfsについて
Kazuhiro Nishiyama
 
PDF
ゼロからはじめるKVM超入門
VirtualTech Japan Inc.
 
PDF
Intro to SVE 富岳のA64FXを触ってみた
MITSUNARI Shigeo
 
PDF
あるコンテキストスイッチの話
nullnilaki
 
PDF
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
 
PDF
フラグを愛でる
MITSUNARI Shigeo
 
PDF
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
Fixstars Corporation
 
PDF
C/C++プログラマのための開発ツール
MITSUNARI Shigeo
 
PPTX
TVMの次期グラフIR Relayの紹介
Takeo Imai
 
PPTX
分散システムについて語らせてくれ
Kumazaki Hiroki
 
PPTX
UEFIによるELFバイナリの起動
uchan_nos
 
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
 
PDF
C++でできる!OS自作入門
uchan_nos
 
PDF
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
Yahoo!デベロッパーネットワーク
 
いまさら聞けない!CUDA高速化入門
Fixstars Corporation
 
不揮発メモリ(NVDIMM)とLinuxの対応動向について(for comsys 2019 ver.)
Yasunori Goto
 
10分で分かるLinuxブロックレイヤ
Takashi Hoshino
 
Magnum IO GPUDirect Storage 最新情報
NVIDIA Japan
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
 
CXL_説明_公開用.pdf
Yasunori Goto
 
initramfsについて
Kazuhiro Nishiyama
 
ゼロからはじめるKVM超入門
VirtualTech Japan Inc.
 
Intro to SVE 富岳のA64FXを触ってみた
MITSUNARI Shigeo
 
あるコンテキストスイッチの話
nullnilaki
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
 
フラグを愛でる
MITSUNARI Shigeo
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
Fixstars Corporation
 
C/C++プログラマのための開発ツール
MITSUNARI Shigeo
 
TVMの次期グラフIR Relayの紹介
Takeo Imai
 
分散システムについて語らせてくれ
Kumazaki Hiroki
 
UEFIによるELFバイナリの起動
uchan_nos
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
 
C++でできる!OS自作入門
uchan_nos
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
Yahoo!デベロッパーネットワーク
 

More from NTT DATA Technology & Innovation (20)

PDF
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
PDF
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
2025年現在のNewSQL (最強DB講義 #36 発表資料)
NTT DATA Technology & Innovation
 
PDF
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
NTT DATA Technology & Innovation
 
PDF
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
NTT DATA Technology & Innovation
 
PDF
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
NTT DATA Technology & Innovation
 
PDF
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
NTT DATA Technology & Innovation
 
PDF
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
NTT DATA Technology & Innovation
 
PDF
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
NTT DATA Technology & Innovation
 
PDF
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
NTT DATA Technology & Innovation
 
PDF
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
NTT DATA Technology & Innovation
 
PDF
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...
NTT DATA Technology & Innovation
 
PDF
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQL17対応版 EXPLAINオプションについて (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
 
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
NTT DATA Technology & Innovation
 
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
NTT DATA Technology & Innovation
 
2025年現在のNewSQL (最強DB講義 #36 発表資料)
NTT DATA Technology & Innovation
 
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
NTT DATA Technology & Innovation
 
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
NTT DATA Technology & Innovation
 
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
NTT DATA Technology & Innovation
 
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
NTT DATA Technology & Innovation
 
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
NTT DATA Technology & Innovation
 
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
NTT DATA Technology & Innovation
 
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
NTT DATA Technology & Innovation
 
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
NTT DATA Technology & Innovation
 
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
NTT DATA Technology & Innovation
 
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...
NTT DATA Technology & Innovation
 
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL17対応版 EXPLAINオプションについて (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
 
Ad

Recently uploaded (10)

PDF
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
PDF
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 
PDF
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
PDF
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
PDF
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
PDF
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
PDF
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
PDF
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
PDF
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
Ad

Deep Dive into the Linux Kernel - メモリ管理におけるCompaction機能について

  • 1. 2021/3/20 NTTデータ 技術統括本部 システム技術本部 デジタル技術部 インテグレーション技術担当 齊加匠 Deep Dive into the Linux Kernel - メモリ管理におけるCompaction機能について
  • 2. © 2021 NTT DATA Corporation 2 テーマ方針 compaction について調査 具体的には Linux Kernel のコードを読み解き, 実際にどのような処理を行っているか、工夫点などを調査、検証 使用した Linux Kernel のバージョンは 5.8.2
  • 3. © 2021 NTT DATA Corporation 3 そもそも compaction とは Fragmentationを緩和するための手法 Fragmentation メモリに対して allocation と deallocation を繰り返すと, メモリが「虫食い」状態になり、使用可能な連続した領域が 少なくなってしまう現象
  • 4. © 2021 NTT DATA Corporation 4 仕組みの概要 LWN.net(左記)によると 引用:https://lwn.net/Articles/368869/  以下の2つの探索を走らせる 1. 低位から高位へとmovable pagesを探索する処理 2. 高位から低位へとfree pagesを探索する処理  2つの探索がぶつかると、探索をやめて、 movable pagesをfree pagesへ移動させる 以上の処理によって、fragmentationが解消される ※ここでいう”page”とは,physical pageのことであり,物理メモリを分割する単位の一つである
  • 5. © 2021 NTT DATA Corporation 5 処理の工夫点  memory isolation を行うことによって, candidate のリストを作り,それを操作するよ うにしている  compaction処理中にページリストの主要な ロックをつかみ続ける必要がなくなるため,性 能を向上させることができる static unsigned long isolate_freepages_block(struct compact_control *cc, unsigned long *start_pfn, unsigned long end_pfn, struct list_head *freelist, unsigned int stride, bool strict) { //略 for (; blockpfn < end_pfn; blockpfn += stride, cursor += stride) { int isolated; struct page *page = cursor; //略 order = page_order(page); isolated = __isolate_free_page(page, order); if (!isolated) break; set_page_private(page, order); total_isolated += isolated; cc->nr_freepages += isolated; list_add_tail(&page->lru, freelist); //略 } //略 } mm/compaction.c
  • 6. © 2021 NTT DATA Corporation 6 呼び出し関係  compaction の処理はpage_alloc.c(pageの割り当てを行っている)から呼び出されている
  • 7. © 2021 NTT DATA Corporation 7 movable pageを探す処理 static isolate_migrate_t isolate_migratepages(struct co mpact_control *cc) { //略 for (; block_end_pfn <= cc->free_pfn; fast_find_block = false, low_pfn = block_end_pfn, block_start_pfn = block_end_pfn, block_end_pfn += pageblock_nr_pages) { //略 low_pfn = isolate_migratepages_block(cc, low_pf n, block_end_pfn, isolate_mode); //略 break; } //略 return cc- >nr_migratepages ? ISOLATE_SUCCESS : ISOLATE_NONE; } mm/compaction.c 低位から高位へと movable pages を探索している 実際に実行する処理は isolate_migratepages_block に実装されている
  • 8. © 2021 NTT DATA Corporation 8 free pageを探す処理 static void isolate_freepages(struct compact_control *cc ) { //略 for (; block_start_pfn >= low_pfn; block_end_pfn = block_start_pfn, block_start_pfn -= pageblock_nr_pages, isolate_start_pfn = block_start_pfn) { unsigned long nr_isolated; //略 nr_isolated = isolate_freepages_block(cc , &isolate_start_pfn, block_end_pfn, freelist, stride, fal se); //略 } //略 } mm/compaction.c 高位から低位へと free pages を探索している 実際に実行する処理は isolate_freepages_block に実装されている
  • 9. © 2021 NTT DATA Corporation 9 zoneをcompactする処理 static enum compact_result compact_zone(struct compact_control *cc, struct capture_cont rol *capc) { //略 while ((ret = compact_finished(cc)) == COMPACT_CONTINUE) { //略 switch (isolate_migratepages(cc)) { //略 case ISOLATE_SUCCESS: update_cached = false; last_migrated_pfn = start_pfn; ; } err = migrate_pages(&cc- >migratepages, compaction_alloc, compaction_free, (unsigned long)cc, cc->mode, MR_COMPACTION); //略 } //略 } mm/compaction.c compact_finishedはcompact_scanners_met を呼び出している. (つまり,free pages scanner が movable pages scanner より低位に行った場合, 止まるよう実装されている.) isolate_migratepages が呼び出されている. compaction_allocはisolate_feepagesを 呼び出している
  • 10. © 2021 NTT DATA Corporation 10 pageをmigrateする処理 int migrate_pages(struct list_head *from, new_page_t get_new_page, free_page_t put_new_page, unsigned long private, enum migrate_mode mode, int reason) { //略 for(pass = 0; pass < 10 && retry; pass++) { retry = 0; list_for_each_entry_safe(page, page2, from, lru) { retry: //略 rc = unmap_and_move(get_new_page, put_new_page, private, page, pass > 2, mode, reason); switch(rc) { //略 case MIGRATEPAGE_SUCCESS: nr_succeeded++; break; //略 default: //略 nr_failed++; break; } } } nr_failed += retry; rc = nr_failed; //略 return rc; } mm/migrate.c 10 回試す or movable pages がない 場合に return する free pages に migrate している (unmap_and_move)
  • 11. © 2021 NTT DATA Corporation 11 まとめ  compactionとはデフラグの手法である  compactionの機能が実際にどう動作しているのか,カーネルのソース コードレベルで把握することが出来た.(compactionの基本の原理自 体は既知だったが,実際にどのように動作しているのか解説した資料はな かった)  実装の工夫点としてはmemory isolatationを行うことで性能向上を 図っていることなどが分かった
  • 12. © 2021 NTT DATA Corporation 本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。
  • 13. © 2021 NTT DATA Corporation 13 学んだこと(kernel の読み方) 1. まずはざっくりとコメントを読んで当たりをつける →コードの量が多いので,主処理がどこかを探して,それ以外を読み飛ばしていくことが肝要 2. メソッド名,変数名に着目して,処理内容を推測する →気になった箇所については、その先を詳しく追う 3. コメントとソースコードの対応関係を見る →if 文、ループ、break、goto 文などの処理に着目
  • 14. © 2021 NTT DATA Corporation 14 学んだこと(kernel の読み方)具体例 /* * Migrate an array of page address onto an ar ray of nodes and fill * the corresponding array of status. */ static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes, unsigned long nr_pages, const void __user * __user *pages, const int __user *nodes, int __user *status, int flags) { //略 for (i = start = 0; i < nr_pages; i++) { const void __user *p; unsigned long addr; int node; //略 /* * If the page is already on the targe t node (!err), store the * node, otherwise, store the err. */ err = store_status(status, i, err ? : current_node, 1); if (err) goto out_flush; err = move_pages_and_store_status(mm, current_node, &pagelist, status, start, i, nr_pages); if (err) goto out; current_node = NUMA_NO_NODE; } out_flush: /* Make sure we do not overwrite the exist ing error */ err1 = move_pages_and_store_status(mm, cur rent_node, &pagelist, status, start, i, nr_pages); if (err >= 0) err = err1; out: return err; } mm/migrate.c