Статьи

Нарихиро Накамура: новатор GC Руби

Нарихиро Накамура сделал ряд ключевых
улучшения алгоритма Ruby’s GC

Впервые я столкнулся с именем Нарихиро Накамуры, когда исследовал статью о сборке мусора, которую написал в марте. Он только что внес большое изменение в грядущий выпуск MRI Ruby 2.0, включив новую технику сбора мусора, называемую «растровая маркировка», которая обещает ускорить ваши приложения за счет улучшения работы процессов Ruby с общей памятью. Позже я посмотрел видео отличной презентации, которую Нарихиро сделал на RubyConf Argentina 2011 под названием « Параллельные миры GC CRuby», о методе сбора мусора, называемом «параллельная маркировка». Затем я заметил на его веб-сайте, что Нарихиро совершил различные другие изменения кода, связанные с GC, в Рубин за последние несколько лет. Было ясно, что сборка мусора была постоянной страстью к Нарихиро — страсти, которая приносит пользу всем нам!

В этом месяце я решил взять интервью у Нарихиро для RubySource — мне было интересно узнать больше о нем и его работе. Из-за языкового барьера мы общались по электронной почте, в отличие от других моих интервью на RubySource, но я включил здесь его оригинальные ответы на японском языке для тех из вас, кто понимает японский. Читайте дальше, чтобы узнать больше о Нарихиро и понять все улучшения, которые Нарихиро и основная команда внесли в GC за последние несколько лет.

Кто такой Нарихиро Накамура?

Q: Привет Нарихиро, большое спасибо за ваше время. Как ваши дела?

Привет — никаких проблем … У меня все отлично!

Q: ari ん に ち は Нарихиро 、 お 時間 を い だ き あ り が と う ご ご い ま す す 元 元 気 で す か??

こ ん に ち は, い え い え 問題 な い で す よ. 元 気 で す!

Конференция RubyWorld в префектуре Симанэ, Япония, запланирована на 8-9 ноября.

Q: Можете ли вы рассказать нам немного о себе? Откуда ты? Где вы работаете? Что вас интересует помимо Ruby?

В настоящее время я живу в префектуре Симанэ, Япония . Кстати, конференция RubyWorld пройдет здесь 8-9 ноября. Мы надеемся, что вы все можете присоединиться к нам!

Я работаю в NaCl (Лаборатория сетевых прикладных коммуникаций). Здесь работают шесть основных коммитеров Ruby, включая Юкихиро Мацумото .

Ммм … за Руби? Ну, я действительно заинтересован в сборке мусора. И, конечно же, мне также нравится Ruby, потому что у него есть собственный сборщик мусора.

Q: か な か か か か か か か か か か か か か か か か か か か か か か か

の は 日本 の 根 県 に 住 で い い。。 の の 月 月 11 は に 島 根 は は y Con Con Con Con Con Con Con は は ん ん ら ら ら ら

NaCl (сеть Applied Communication Laboratory Ltd.) で 働 い て い ま す. こ の 会 社 に は MRI の コ ミ ッ タ ー が 6 人 も い ま す. 世界 で も っ と も 多 く の рубин コ ミ ッ タ が 働 い て い る 会 社 で す ね. そ し て, そ の う ち の 一 人 が @yukihiro_matzで す.

за Руби. GC 、 は 興味 が あ ま す す で も 、 、 y y 、 き き す す の の の の の の の C C C C で で で で す。

Q: Кто другие 5 коммитеров Ruby в NaCl?

Shugo Maeda , Shyouhei Urabe , Yuuzou Gotou , Кодзи Такао и я 🙂

Q: NaCl の 他 の 5 人 の コ ミ ッ タ は 誰 で す か?

Shugo Maeda , Shyouhei Urabe , Yuuzou Gotou , Кодзи Такао и я 🙂

Q: Как вы впервые познакомились с Ruby?

Впервые я познакомился с Ruby около пяти лет назад, когда наткнулся на несколько статей в Интернете о Ruby. Я также был вдохновлен выступлением Какутани Синтаро «От Java до Ruby» — это заставило меня поверить, что Ruby был здесь, чтобы остаться. Затем я начал программировать на Ruby как хобби.

Q: Ruby と の 最初 の 出 会 い は?

5 に 以上 前 に Rails を 記事 を WEB ペ ー ジ 上 読 』だ の が 最初 き き っ け け だ い ま す。 、 、 k k『 ら ら ら ら ら ら ら y y y y y y y y y Y 」と 思 い ま た。。 し て で で Ruby プ ロ グ ラ ミ ン グ は じ め め ま た。。

В: Как вы решили поработать над сборкой мусора?

Руководство по взлому Ruby , моя любимая книга, утверждает, что одним из слабых мест Ruby является производительность GC. Когда я прочитал это, я подумал: «Может быть, я смогу позаботиться об этом». Поскольку я никогда не был официально обучен алгоритмам сбора мусора, мне пришлось узнавать об этом самостоятельно. Теперь я хочу применить то, что я узнал, чтобы улучшить сборщик мусора MRI.

Q: て の よ う に し て C C 研究 研究 や る こ 決 め め た で で??

Руководство по взлому рубинов 『い『 『『 『『 『『 『『 『 GC の 知識 深 め を を を を を を を を を を を を を を を を を を を を

В: Каково это работать с основной командой Ruby?

Члены основной команды Ruby — очень уникальные и классные люди. Я уважаю их, и для меня большая честь работать с ними.

Q: Ruby. Y コ ア チ ー ム 一 一 緒 に 仕事 を す の は ど ん な 感 感 す か??

Руби

В: Можете ли вы вспомнить забавную или интересную историю о работе с основной командой, которая понравится читателям?

О, пожалуйста, посмотрите категорию шутки Рубин Redmine . Я настоятельно рекомендую «Сжать последовательность концов» .

Q: コ ア チ ー ム と の 仕事 、 楽 楽 い ・ ・ い 話 が あ り り か??

Ruby の Redmine のШутка ress テ ゴ リを 見 て く だ い。。 私 オ ス ス メ は「Сжать последовательность концов ressで す 🙂

Зачем изучать сборку мусора?

Q: На первый взгляд, GC кажется скучной темой. Почему остальные из нас должны быть заинтересованы в этом?

Целью сбора мусора является освобождение неиспользуемых сегментов памяти. Это кажется очень простой и понятной задачей, но на самом деле это очень сложно. Идеального решения не существует. Но это то, что делает его интересным для меня. Поскольку большинству программистов нравится решать сложные задачи, им, безусловно, понравится GC.

Кроме того, многие алгоритмы GC были изобретены легендарными хакерами: Джон Маккарти, Эдсгер Уайб Дейкстра, Дональд Эрвин Кнут и, конечно, наш собственный «Matz». GC привлекла внимание даже легендарных хакеров.

Q: 一 し た と こ ろ 、 、 、 、 、 、 、 、 、 、 、 、 べ ょ つ つ つ つ つ つ つ つ つ

ГХ は 「自動 で 利用 し て い な い メ モ リ 領域 を 解放 す る」 と い う 単 純 な ミ ッ シ ョ ン に 見 え る に も 関 わ ら ず, そ れ を 解決 し よ う と な る と 大 変 に 難 し い 問題 に な っ て し ま う と こ ろ が 面 白 い で す ね. プ ロ グ ラ マ は 本質 的 に難 し い 問題 が 好 き だ と 思 い ま す. き っ と ГХ も 気 に 入 る で し ょ う.

ま た, い く ら か の GC ア ル ゴ リ ズ ム は 伝 説 的 な ハ ッ カ ー た ち に よ っ て 作 ら れ て い ま す. た と え ば Джон Маккарти や Эдсгер Wybe Дейкстра, Дональд Эрвин Кнут, そ し て ま つ も と さ ん. 彼 ら の よ う な 偉大 な ハ ッ カ ー で さ え も 巻 き 込 ん で し ま う よ う な 魅力を ГХ は 持 っ て い る と 思 い ま す.

В: Должны ли разработчики Ruby думать о GC, когда пишут свой код? Или просто предположите, что это произойдет «волшебным образом»?

Одна из целей сбора мусора — правильно функционировать, даже если люди не обращают на это внимания. Если разработчик считает сборку мусора «волшебной» и ничего плохого не происходит, то она работает как задумано — и автор системы GC будет счастлив. Однако в практическом приложении вам иногда нужно беспокоиться о GC, например, когда приложение требует плавного выполнения без пауз.

Q: Руби

C 開 に C C C C C C C C C C C は は は は は は はで す の で, こ れ ほ ど 嬉 し い こ と は あ り ま せ ん. た だ し, と り わ け 実 践 的 な ア プ リ ケ ー シ ョ ン で は, ГЦ に つ い て 考 え な け れ ば な ら な い で し ょ う. た と え ば, 停止 時間 に シ ビ ア な ア プ リ ケ ー シ ョ ン な ど で す.

Краткий обзор инноваций GC

В: Что означает «пометить и подмести»?

Прежде чем я объясню Mark and Sweep (M & S), позвольте мне сначала объяснить несколько основных концепций GC. Основная задача сборщика мусора — собрать все мертвые предметы. Мертвый объект — это объект, на который программа никогда не ссылается.

M & S является одним из многих алгоритмов GC. Все системы Mark и Sweep GC имеют две отдельные фазы: фазу маркировки и фазу развертки.

  • На этапе пометки сборщик помечает объекты живых объектов, на которые все еще ссылается программный код.
  • В фазе развертки он сканирует всю кучу и «сметает» «мертвые» (немаркированные) объекты.

Q: マ ー ク ア ン ド ス ー プ は は う い い 意味 で す か?

ま ず は ГХ の 簡 単 な コ ン セ プ ト を 説明 さ せ て く だ さ い. ГХ と は す べ て の 死 ん だ オ ブ ジ ェ ク ト を 回収 す る も の で す. 死 ん だ オ ブ ジ ェ ク ト と は, プ ロ グ ラ ム か ら 二度 と 参照 で き な く な っ た オ ブ ジ ェ ク ト を 指 し ま す.

そ し て, マ ー ク ア ン ド ス イ ー プ (М & S) は ГХ の ア ル ゴ リ ズ ム の 一種 で, 処理 は マ ー ク フ ェ ー ズ と ス イ ー プ フ ェ ー ズ に 別 れ て い ま す. マ ー ク フ ェ ー ズ で は 生 き て い る オ ブ ジ ェ ク ト に 印 を 付 け て い き ま す. ス イ ー プ フ ェ ー ズ で は ヒ ー プ 全体 を ス キ ャ ンし, 死 ん で い る (マ ー ク さ れ て い な い) オ ブ ジ ェ ク ト を 開放 し ま す.

В: Как система GC узнает, на какие объекты в данный момент ссылается программа во время фазы пометки?

Система GC может находить живые объекты путем обхода набора указателей (например, на локальные переменные Ruby, глобальные переменные и т. Д.), Которые непосредственно ссылаются на объекты в программе.

Q: GC は マ ー ク 時 に ど う う う し て プ グ ラ ラ ム か ら オ ェ ェ 参照 参照 参照 れ い い こ こ と 知 す か か か

GC は プ ロ グ ラ ム 中 か ら オ ブ ジ ェ ク ト を 直接 参照 す る ポ イ ン タ の 集合 (例 え ば рубин の ロ ー カ ル 変 数 や グ ロ ー バ ル 変 数 …) を ト ラ バ ー ス す る こ と で, 生 き て い る オ ブ ジ ェ ク ト を 知 り ま す.

В: Что означает «Lazy Sweep»? Чем он отличается от Mark and Sweep?

Поскольку традиционные системы M & S GC выполняют разметку и очистку за одну атомарную операцию, приложение приостанавливается во время сбора мусора.

У Ленивого подметания, подметание лениво. Каждый вызов распределителя объектов очищает кучу Ruby до тех пор, пока он не найдет один подходящий свободный объект, а затем вернется. Это улучшает время отклика GC; т.е. наихудшее время работы сборщика мусора уменьшается.

Q: «遅 延 ス イ ー プ» と は ど う い 意味 で す?? マ ー ク ア ス ス ス プ と と ど の う い い す す か?

の 来 の M & S (が ー ク ア ド ス プ プ で) プ は ー ク と ス イ ー が が が が が が が が 、 、 、 、 、 、 、 、 、 、 、 、 y y y y ま

LazySweeping で は, ス イ ー プ を 遅 延 し て お こ な い ま す. オ ブ ジ ェ ク ト ア ロ ケ ー シ ョ ン の タ イ ミ ン グ で, 適 切 な 死 ん だ オ ブ ジ ェ ク ト を 見 つ け る ま で подметать を お こ な い ま す. LazySweeping に よ っ て, GC の レ ス ポ ン ス タ イ ム が 向上, つ ま り, GC に よ る 最 悪 停止 時間 が 減 り ま す,

Q: Но алгоритм Lazy Sweep GC все еще должен отмечать все объекты? Фаза отметки все та же? Разница лишь в том, что фаза развертки быстрее?

Это правильно. Тем не менее, пропускная способность фазы развертки не уменьшается, потому что Lazy Sweeping просто амортизирует стоимость развертки, когда распределитель выполняет развертку.

Q:? LasySweep ア ル ゴ リ ズ ム で も ぜ ん ぶ の オ ブ ジ ェ ク ト は マ ー ク し な い と い け な い ん で す よ ね マ ー ク フ ェ ー ズ は 依然 と し て 同 じ で す か ス イ ー プ フ ェ ー ズ が 速 く な っ た の が 唯一 の 違 い で す か?

そ う で す ね. た だ し, ア ロ ケ ー タ で ス イ ー プ さ せ る こ と に よ っ て ス イ ー プ の コ ス ト を 分割 し て い る だ け な の で, ス イ ー プ フ ェ ー ズ の ス ル ー プ ッ ト は 減少 し ま せ ん.

В: Что такое патч «Long Life GC»?

Патч «Long Life GC» рассматривает долгоживущие объекты как особый случай. это похоже на Поколение GC. Тем не менее, патч не используется ни в одной текущей версии Ruby.

Q: «長 寿命 GC» パ ッ チ と は 何 で す か?

C れ は 長 寿命 オ ブ ジ ジ ト ト ト 扱 い る も も の で 別 別 C C C う な も 、 、 、 、 、 L 、 、 、 い い い い い ject ject

В: Что такое «Параллельная маркировка?»

Коллектор Parallel Marking выполняет несколько процессов маркировки параллельно, используя собственные потоки. Это может улучшить вашу производительность, если вы используете многоядерный компьютер.

Это может показаться простым, но на самом деле это очень сложный и сложный процесс.
Пожалуйста, смотрите мою презентацию Параллельные миры GC CRuby
если ты заинтересован.

Q: «並列 マ ー キ ン グ» と は 何 で す か?

Параллельный маркировочный коллектор ЦП の ア を の の の の の の の の る る る る る る る る る る

簡 単 に 実 で き る と れ れ れ れ も も ま せ せ せ ん 、 意外 と 倒 が 深 深 は は は は ス ス ス ス

Q: Что такое «патч кучи»?

Какая нежная память! «Патч кучи кучи» был моим первым вкладом в МРТ ГХ.

В Ruby 1.8.x при расширении кучи мы выделили новый непрерывный блок памяти, в 1,8 раза превышающий размер старой кучи. При таком подходе мы не могли освободить большой блок, если бы в нем был хотя бы один живой объект. Моя «Заплата подразделения кучи» делит непрерывный блок на подблоки. Этот патч увеличивает шансы на освобождение мертвых субблоков, что снова повышает производительность GC.

Q: «ヒ ー プ 細分 パ ッ チ» と は 何 で す か?

I に し い! こ れ 番 番 た 番 番 に に に に に に に に に に に に で で で。。。。

Ruby1.8 で は ヒ ー プ を 拡 張 時 に 拡 張 前 の ヒ ー プ サ イ ズ の 1.8 倍 の 連 続 し た メ モ リ の ブ ロ ッ ク を 確保 し て い ま し た. こ の ア プ ロ ー チ で は, ブ ロ ッ ク 内 に 1 つ で も 生 き て い る オ ブ ジ ェ ク ト が あ れ ば そ の ブ ロ ッ ク は 解放し て は い け ま せ ん の で, 巨大 な ブ ロ ッ ク は い つ ま で も 解放 さ れ ま せ ん.

Патч кучи кучи 」で は ロ を を をを

В: Что такое «Растровая маркировка»?

В Bitmap Marking флаги «живых объектов» хранятся в отдельной таблице растровых изображений, а не в заголовке каждого объекта. О, я думаю, что ваша статья — лучший источник информации по этой теме!

Q: «Растровая маркировка» と は 何 で す か?

Bitmap Маркировкаではマークビットを,オブジェクトヘッダではなく,ヒープと別の空間のビットマップテーブルで保持し,ビットマップに対してマークをおこなうアルゴリズムです.あ, ХакодатеのЯматоピックについてはあなたの記事が最高の情報だと 思 い ま す!

Q: Спасибо, Нарихиро! Есть ли какие-либо другие нововведения GC, о которых вы хотите упомянуть?

Недавно я изучил алгоритм сборки мусора G1GC, используемый в OpenJDK7. Это может контролировать максимальное время паузы операций ГХ. Кроме того, меня интересует C4 от Azule . Этот алгоритм обеспечивает бесперебойную сборку мусора с помощью специальных инструкций процессора. Это весело!

Q: C な た が 言及 し た い の C C C C 技術 は り ま ま??

J っ と 調 べ き た の は J OpenJDK7 に 入 っ た G1GC で す ね。 れ は C C C C を で き C ル ゴ ゴ リ ム

、 た 、 Azule の C4 も 注目 し い ま。 こ ち は は ハ ー ド ウ ェ サ サ ト に よ よ っ 停止 C 現

Будущее ГК

Q: Что будет дальше для Ruby GC?

Во-первых, я планирую представить несколько небольших исправлений в M & S — например, нерекурсивную маркировку и цикл предварительной выборки. И я хотел бы реорганизовать gc.c, чтобы упростить внедрение небольших исправлений, подобных этим. Затем я планирую реализовать патч для параллельной разметки, о котором я упоминал ранее.

Q: は は Ruby の GC に 何 が 入 る で し ょ う?

М & S に 対 し て 細 か い 修正 を 入 れ て い き た い と 思 っ て い ま す. 例 え ば, 非 再 帰 的 マ ー キ ン グ, と предвыборки を 使 っ た マ ー キ ン グ で す. あ と は gc.c を リ フ ァ ク タ リ ン グ し て, 上 記 の よ う な 小 さ な 修正 を と り こ み や す く し た いで す ね.

そ の 後 に, 並列 マ ー キ ン グ を 取 り 込 み ま す.

В: Может ли MRI Ruby чему-то научиться у JRuby, Rubinius или других версий Ruby?

JRuby использует GC JVM. Я завидую этому 🙂 И всякий раз, когда я читаю исходный код GC Рубиниуса, я всегда удивляюсь, насколько красив этот код.

Я думаю, что сборщик мусора MRI немного отстает по сравнению с другими реализациями GC. По историческим причинам, большинство из которых относятся к расширениям C в Ruby, эту ситуацию трудно существенно изменить. Тем не менее, я надеюсь сделать что-нибудь об этом.

Q: МРТ の Рубин 、 、 JRuby 、 Рубинус の や Рубин の 他 の バ ー ジ ョ ン か ら か を を を こ と

JRuby は JVM の GC を 使 っ い ま す ら ね。 ら ら や し し い す 、 と 思 思 ま す 🙂 Рубиниус の C 読 に り り り り り り り い い い い い

МРТ の ГХ は 他 の バ ー ジ ョ ン の ГХ に 比 べ て 劣 っ て い る と 思 い ま す. た だ 歴 史 的 な 理由 か ら (主 に С 拡 張 ラ イ ブ ラ リ の 仕 様 に よ っ て), МРТ の ГХ の 大 き な 変 更 は 難 し い ん で す よ ね. こ れ はど う に か し た い で す.

В: Над чем еще вы работаете, и о чем бы всем рассказали?

Я недавно написал книгу! Рассматривая реализацию G1GC … извините, это только на японском языке.

Q: そ の 他 に な に か み な に に え る べ 取 り り み が が り ま す か?

1子 書籍 を 書 電 ま た! 徹底 1 1 G1GC: 実 装 編

Новая книга Нарихиро описывает реализацию алгоритма G1GC в OpenJDK7.

В: Какие у тебя планы на будущее?

У меня нет конкретных планов … но я хочу продолжать улучшать алгоритм GC Руби понемногу.

Я хотел бы поблагодарить моего коллегу мистера Тора, который помог мне перевести эти ответы на английский язык. Благодарность!

Q: あ な た の 将来 の 計画 は?

将来 の こ と は 考 え て い ま せ ん が, ГЦ の 取 り 組 み は コ ツ コ ツ と 続 け た い で す.