メインコンテンツへスキップ

Jemalloc ポストモーテム その内容とは?

·9 分
2025/06 Jemalloc メモリ管理 パフォーマンス C++ ライブラリ

Jemalloc ポストモーテム その内容とは?

引用元:https://news.ycombinator.com/item?id=44264958

Svetlitski 2025/06/13 03:35:43

Jemallocリポジトリのアーカイブ、気持ちは分かるけど悲しいわ。僕がいた頃もメンテ大変だったしね(Itaniumでテスト失敗した報告とか面白かった)。Jemallocはやっぱ使いやすい汎用mallocで最高だと思う。TCMallocもいいけど、Bazel以外だとマジで使うの面倒なんだよ。Bazel 7.4.0でマシになったけどさ。メンテナーのQiに最終リリースお願いしたいな。その時にデフォルト設定も現代化したいな。キャッシュオブリビアス無効とかページサイズ大きくするとか。これ性能めっちゃ上がるんだよね(メモリ使うけど)。前に社内でやったら数%CPU改善したよ。他にもいくつか変えたい設定あるけど、これが一番でかいな。

kstrauser 2025/06/13 03:43:45

こういう話、マジで好き!投稿ありがとう!
Bazel使わない時って、TCMalloc使うの何が大変なの?(別に疑ってるわけじゃなくて、ガチで気になるんだ)

Svetlitski 2025/06/13 04:01:03

単純にビルドしてリンクするのがクソ大変なんだよ。
Bazel 7.4.0の前はさ、ダイナミックリンク(遅いしデプロイ面倒)か、スタティックライブラリを手で作る(これがマジでダルい)しか選択肢なかったの。
Metaにいた時、Jemallocと比べるために、TCMallocのBazelファイルをBuck2に手作業で書き換えたくらい。それ以外良い方法なかったんだよ。
Googleの外で使うと、特定のLinux設定を前提にしてて、そうじゃないと色々問題起きたりするんだよ。詳しくはここね: https://google.github.io/tcmalloc/tuning.html#system-level-o

mort96 2025/06/13 08:17:42

Googleのヤツらは、Google社内システム以外で使うとマジで全部大変なんだよ。
Chromiumとかも超デカいモノリポで、依存関係ぐちゃぐちゃ。ABIとか全然気にしないし、ASANとかでABI変わるし、コンパイラとかちょっと違うだけで壊れる。
ソースからビルドしようとすると、数十GBとかダウンロードさせられるし、ベンダーライブラリも古いまま使わされる。
ヘッダーファイルも整理されてなくて、”base/pc.h”とか、相対パスがおかしいのが多いんだよね。インクルードパス汚染しないといけない。
Abseil、WebRTC、gRPC、protobufとか、Googleのライブラリは避けてるわ。仕事で仕方なくWebRTC使う時は、プロセス分けたりする。それ以外は苦しみを受け入れるしかない。これブログに書くべきだったな。

matoro 2025/06/13 04:11:05

Itaniumのテストスイート失敗報告したの、それ俺です :)

ahartmetz 2025/06/13 08:44:25

あんたのGoogle批判、全然足りないね ;)
Blinkとかコンパイル超時間かかるんだよ。Geckoより何倍も。Googleは前方宣言使わないで全部インクルードするポリシーだから。ビルド時間気にする人にはマジで意味不明だよね。Googleは多分、ハードと分散キャッシュでゴリ押ししてて、外部のビルド環境とか全く考えてないんだよ。あとビルドスレッドごとに2GB RAM必要とか、これも普通じゃないし。

einpoklum 2025/06/13 08:19:58

> TCMalloc is great, but is an absolute nightmare to use if you’re not using bazel
カスタムmalloc初心者の質問なんだけどさ、ライブラリの使いやすさを評価するのに、ビルドシステムを選ぶことがなんで重要になるの?

prpl 2025/06/13 04:37:42

LLM使ってMakefileをBazelに移行させたことあるけど、まあまあいけたよ。
逆(Bazel→Makefile)は試してないけど、最近はそんなに大変じゃないかもね。まあ人によるけどさ、参考にしてみて。

bialpio 2025/06/13 18:16:13

Chromiumは、Google全体のポリシーと違って、前方宣言を許可してるよ: https://chromium.googlesource.com/chromium/src/+/main/styleg…, ”Forward declarations vs. #includes”.

ahartmetz 2025/06/13 18:42:34

すごく嬉しいけど、まだ将来変わるかもってことだよね。だって、この前のコードではインクルードだらけだったから。まあ、一つ思い出した、すごく偏った例だけど、コンパイルが特に遅かったクラスを見たんだ。Ryzen 7950Xでも40秒くらいかかって、RAMも2GBくらい使ってた。コードは200行もないし、普通はコンパイルに時間かからないようなこと何もしてないように見えた…含まれてるもの以外はね。含まれてるものも特に凝ったことはしてないように見えたんだ。でも、compile firewallsを追加しないと、推移的なインクルードって雪だるま式に増えちゃうんだよね。

rfoo 2025/06/13 08:44:33

彼らはpublic header fileとsource codeを区別するために一切努力してないって言うけど、違うやり方でやってるよ。世の中は慣習で区別してる、別々のディレクトリ階層(src/, include/)に置くことでね。google3はbuild systemに依存してそうしてるんだ。「どのheader fileがpublicか」はBUILD filesに文書化されてる。だから、違いを理解するには彼らのbuild systemを使う必要があるんだよね :(。
彼らのpublic headersは #include ”base/pc.h” みたいなおかしなことしがちで、その ”base/pc.h” パスはincludeしてるファイルからの相対パスじゃないって?
これについては同意できないな。相対include pathsに頼るのは最悪だよ。-I/project/rootみたいに、プロジェクトルートからのパス指定が一番だよ。

CamouflagedKiwi 2025/06/13 17:26:22

それをbuildする必要があるからだよ。もし彼らが君と同じbuild systemを使ってなかったら、彼らのシステムを呼び出すか、自分のシステムにimportするしかない。前者はそれが’heavy’だったりsubprocessとしてうまく動かないなら魅力的じゃないし、後者は replicating するbuild processがcomplexだと時間がかかるんだ。どっちもやったことあるし、様々なレベルのcomplexityのlibrariesを見てきたけど、それがvery complexだと、もう諦めて使わないでおこうって思うポイントは確かにあるね。

rfoo 2025/06/13 08:51:40

なんでdownvoteされたか分かんないけど、俺もClaudeにたくさんのBUILD filesをequivalentなCMakeLists.txtにtranslateさせてみたことあるよ。できた。できたCMakeLists.txtはsuper terribleな見た目だけど、世の中のCMakeLists.txtの95%もそうだから、why bother、どっちみちdoomedだし。

stick_figure 2025/06/13 19:22:09

これはactually publicly visibleなURLでtrackedされてるよ:
https://commondatastorage.googleapis.com/chromium-browser-cl
そしてinclude graph analysis:https://commondatastorage.googleapis.com/chromium-browser-cl…
annotated red dotsは、Chrome developersがbuild timeをoptimizeするためにinclude graphをpruneするbig pushをしたlast timeに対応してるんだ。それはeffectiveだったけど、push backがあった。C++ developersはただmagicが欲しいだけで、dependency managementについてthinkしたくないんだ。彼らをblameするのはhardだ。でも、at the end of the day、buildsはsources times dependenciesでscaleするから、disciplinedじゃなきゃ、superlinear build timesをexpectできるよ。

fc417fc802 2025/06/13 09:14:38

このperspective、面白かったよ。thingsが君のworkflowにあまりfitしなかったのはappreciateできるけど、俺のexperienceはoppositeだった。彼らのprojectsはliterally everythingをsourceからon the spotでbuildingするperspectiveでstructuredされてるみたいで、それが俺のmindsetにmatchesするんだ—俺はnetwork isolated environmentでscratchからbuildすることを選ぶ。As a result、google reposは、fairly easyにup and runningさせられる数少ないものの一つなんだ。alarming number of projectsはapparentlyそんなconditions underでtestedされてなくて、俺は何時間もかけてcmake scriptsをpatching upする羽目になるんだ。(Even worseは、build processの一部として’npm install’をrequireするprojects。Absurdity。)
Oh and you probably don’t want multiple versions of a library in your binary, so be prepared to use Google’s (probably outdated) version of whatever libraries they vendor.
これは俺がrelateできる唯一のcomplaintだね。Sometimes彼らはdependenciesをforward rollingするのにlagする。Not so infrequently、自分でそうしようとするとminor(or not so minor)なissuesがあって、dependenciesをpatching upするtimeをwasteしたくないから、彼らがaround to itするまでstuck for a whileになるんだ。That said、usually rolling forwardはwithout issue worksするよ。
if you try to build their libraries from source, that involves downloading tens of gigabytes of sysroots and toolchains and vendored dependencies.
Out of curiosity、which project did you run into this with? That said、isn’t the only alternative for them moving to something like nix? Otherwise how do you tightly specify the build environment?

mort96 2025/06/13 09:02:53

This. When step one is ”install our weird build system,” I’ll immediately look for something else that meets my needs. All build systems suck, so everyone thinks they can write a better one, and too many people try. Pretty soon you end up having to learn a majority of this (https://en.wikipedia.org/wiki/List_of_build_automation_softw…) to get your code to compile.

username223 2025/06/13 20:19:33

This. Step oneが「install our weird build system」のときは、needsを満たす別のものをすぐ探すよ。All build systemsはsuckするから、みんなbetter oneを書けると思ってるし、too many peopleがtryする。Pretty soon君はcodeをcompileするためにthis (https://en.wikipedia.org/wiki/List_of_build_automation_softw…)の大部分をlearnする羽目になるよ。

einpoklum 2025/06/13 21:14:21

If TCMalloc uses bazel, then you build it with Bazel. It just needs to install itself where you tell it to, and then either it has given you a pkg-config file, or otherwise, your own build system needs some library-finding logic for it (”find module” in CMake terms). Or - are you saying the problem is that you need to install Bazel?

apaprocki 2025/06/13 05:55:12

Ah, porting to HP Superdome servers. It’s like being handed a brochure describing the intricate details of the iceberg the ship you just boarded is about to hit in a few days.
A fellow traveler, ahoy!

klabb3 2025/06/13 12:18:24

> we (i.e. the Jemalloc team) weren’t really in a great place to respond to all the random GitHub issues people would file
Why not? I mean this is complete drive-by comment, so please correct me, but there was a fully staffed team at Meta that maintained it, but was not in the best place to manage the issues?

boulos 2025/06/13 16:07:24

Oh, that wasn’t the intent. I meant two separate things. The Itanic itself was kind of fascinating, but mostly panned (hence the nickname).
SGI’s decision to built out Itanium systems may have helped precipitate their own downfall. That was sad.

ewalk153 2025/06/13 11:37:44

I’ve hit similar problems with their Ruby gRPC library.
The counter example is the language Go. The team running Go has put considerable care and attention into making this project welcoming for developers to contribute, while still adhering to Google code contribution requirements. Building for source is straightforward and iirc it’s one of the easier cross compilers to setup.
Install docs: https://go.dev/doc/install/source#bootstrapFromBinaryRelease

alextingle 2025/06/13 09:26:48

>> #include ”base/pc.h”, where that ”base/pc.h” path is not relative to the file doing the include.
> I have to disagree on this one.
The double-quotes literally mean ”this dependency is relative to the current file”. If you want to depend on a -I, then signal that by using angle brackets.

ahartmetz 2025/06/13 19:56:30

Good that it’s being tracked, but Jesus, these numbers!
110 CPU hours for a build. (Fortunately, it seems to be a little over half that for my CPU. ”Cloud CPUs” are kinda slow.)
I picked the 5001st largest file with includes. It’s zoom_view_controller.cc, 140 lines in the .cc file, size with includes: 19.5 MB.
Initially I picked the 5000th largest file with includes, but for devtools_target_ui.cc, I see a bit more legitimacy for having lots of includes. It has 384 ”own” lines in he .cc file and, of course, also about 19.5 MB size with includes.
A C++20 source file including some standard library headers easily bloats to a little under 1 MB IIRC, and that’s already kind of unreasonable. 20x of that is very unreasonable.
I don’t think that I need to tell anyone on the Chrome team how to improve performance in software: you measure and then you grab the dumb low-hanging fruit first. From these results, it doesn’t seem like anyone is working with the actual goal to improve the situation as long as the guidelines are followed on paper.

rstat1 2025/06/13 17:35:55

Go is kinda of a pain to build from source. Build one version to build another, and another..
Or rather it was the last time I tried.

mort96 2025/06/13 08:57:05

> I have to disagree on this one. Relying on relative include paths suck. Just having one -I/project/root is the way to go.
Oh to be clear, I’m not saying that they should’ve used relative includes. I’m complaining that they don’t put their includes in their own namespace. If public headers were in a folder called include/webrtc as is the typical convention, and they all contained #include <webrtc/base/pc.h> or #include ”webrtc/base/pc.h” I would’ve had no problem. But as it is, WebRTC’s headers are in include paths which it’s really difficult to avoid colliding with. You’ll cause collisions if your project has a source directory called api, or pc, or net, or media, or a whole host of other common names.

bialpio 2025/06/13 22:06:10

> I picked the 5001st largest file with includes. It’s zoom_view_controller.cc, 140 lines in the .cc file, size with includes: 19.5 MB.
> Initially I picked the 5000th largest file with includes, but for devtools_target_ui.cc, I see a bit more legitimacy for having lots of includes. It has 384 ”own” lines in he .cc file and, of course, also about 19.5 MB size with includes.
> A C++20 source file including some standard library headers easily bloats to a little under 1 MB IIRC, and that’s already kind of unreasonable. 20x of that is very unreasonable.
I think you’re not arguing pro-forward-declarations vs anti-forward-declarations here though - it sounds more like an argument for more granular header/source files? In .cc file, each and every include should be necessary for the file to compile (although looking at your example, bind.h seems to be unused and could be removed - looks like the file was refactored and the includes weren’t cleaned up).
With that said, in the corresponding zoom_view_controller.h, the tab_interface.h include looks to be unnecessary so you did find one good example. :)

mort96 2025/06/13 14:19:37

I don’t really have the care nor time to respond as thoroughly as you deserve, but here are some thoughts:
> Out of curiosity which project did you run into this with?
Their WebRTC library for the most part, but also the gRPC C++ library. Unlike WebRTC, grpc++ is in most package managers so the need to build it myself is less, but WebRTC is a behemoth and not in any package manager.
> That said, isn’t the only alternative for them moving to something like nix? Otherwise how do you tightly specify the build environment?
I don’t expect my libraries to tightly specify the build environment. I expect my libraries to conform to my software’s build environment, to use versions of other libraries that I provide to it, etc etc. I don’t mind that Google builds their application software the way they do, Google Chrome should tightly constrain its build environment if Google wants; but their libraries should fit in to my environment.
I’m wondering, what is your relationship with Google software that you build from source? Are you building their libraries to integrate with your own applications, or do you just build Google’s applications from source and use them as-is?

adityapatadia 2025/06/13 06:56:38

Jason、君の仕事がどれだけ僕たちに影響を与えているか、話を聞いてほしいんだ。
僕たちは日に何億もの画像や動画を処理するそこそこの規模の会社を運営してるんだけど、5年前に始めた頃、メモリ断片化関連のデバッグに数えきれない時間を費やしたんだ。
ある日、Jemallocを見つけて、メモリ断片化がひどかったサービスに導入してみたんだ。Dockerfileのたった2行の変更で全部の問題が解決するなんて思ってもいなかったんだけど、嬉しい驚きだったよ。問題は一つ残らず消え去ったんだ。
今では、数百万ドル規模の収益がある僕たちの会社は、全てのサービス、全てのDockerfileで君のメモリallocatorを使ってるんだ。
心からありがとう!

thewisenerd 2025/06/13 08:04:39

そうだよね!ほとんどの画像処理GolangサービスでJemallocを推奨/使用してるよ。
https://github.com/topics/resize-imagesのトップ3(2025-06-13現在)だよ。
imaginary: https://github.com/h2non/imaginary/blob/1d4e251cfcd58ea66f83
imgproxy: https://web.archive.org/web/20210412004544/https://docs.imgp… (imaginaryのリポジトリの議論からリンクされてる)
imagor: https://github.com/cshum/imagor/blob/f6673fa6656ee8ef17728f2

もっとコメントを表示(1)
tecleandor 2025/06/13 09:08:44

うん、imgproxyはlibvipsを使ってるみたいだね。libvipsがJemallocを推奨してるんだ。調べてみたら、これが面白い(面白くないけど)バグ報告だよ。
https://github.com/libvips/libvips/discussions/3019

jcupitt 2025/06/15 14:16:26

こんにちは、libvipsの作者です。これがlibvipsとメモリ断片化に関する多分公式なスレッドで、一番面白いグラフがあるよ。
https://github.com/lovell/sharp/issues/955#issuecomment-5458
(その特定のグラフはglibからmuslメモリallocatorへの切り替えのものだけど、Jemallocでも非常によく似た結果になるんだ)

jcupitt 2025/06/15 16:08:35

あの3つは全部画像処理engineとしてlibvipsを使ってるんだよね。だから、あまり広い調査とは言えないかもね。
libvipsはかなり高度にマルチスレッド化されてて、大量のalloc/freeをするから、ほとんどのheap実装にとっては大変なんだ。

adityapatadia 2025/06/16 14:52:09

僕たちもlibvipsを使ってるんですよ。あなたの仕事からどれだけ恩恵を受けているか、言葉にできません!

laszlojamf 2025/06/13 07:54:10

嫌味に聞こえたら本当にごめんね。正直な質問なんだけどさ、
寄付したの?やっぱり感謝を示すにはお金が一番じゃない?

onli 2025/06/13 08:22:41

あれはmetaのプロジェクトで、開発は終了したんだ。普通のプロジェクトならその期待でいいと思うけど、ここには当てはまらないと思うよ。

adityapatadia 2025/06/13 14:19:16

Open Collective経由でプロジェクトに定期的に寄付してるんだ。Frankly、ここはFBの関与があったからか、そこまで見てなかったんだ。

masklinn 2025/06/13 05:14:49

>jemallocがRustのバイナリから排除されたのは、開発の自然な流れより早かったのかもしれない。
まあ、それは一因ではあったけど、他にもいくつか理由があったんだよ。例えば、このリンクを見てみて。
https://github.com/rust-lang/rust/issues/36963#issuecomment-
あと、jemallocが削除されたのは、そのIssueが立ってから2年も後なんだよね。
https://github.com/rust-lang/rust/pull/55238

Aissen 2025/06/13 08:07:42

面白いね。そこに挙げられてる理由の一つ、arm64でのハードコードされたページサイズが、今もまだ上流で未解決の問題なんだ。
それがアプリ開発者に、複数のarm64 linuxバイナリを出荷させるか、一部のプラットフォームのサポートをやめさせるかって状況になってる。

動的なページサイズ(パフォーマンスのために動的なftraceスタイルのバイナリパッチングみたいな?)だと、そんなに遅かったのかな?

pkhuong 2025/06/13 15:31:48

4KBページのシステムでも、16KBページで設定されたjemallocを実行できるよ。

dazzawazza 2025/06/13 10:40:00

俺はこれまで書いたどのゲームエンジンでもずっとjemallocを使ってるんだ。もうそれが当たり前って感じ。
win32のデフォルトアロケーターより断然速いし、どのプラットフォームでも同じアロケーターを使えるのが良いね。
FreeBSDに統合されてるのを見て知ったんだけど、それ以来手放せないよ。
jemallocはたくさんの人を楽しませるのに貢献してるんだ :)

Iwan-Zotow 2025/06/13 17:28:54

いいね!windowsのデフォルトアロケーターはダメダメだ。jemalloc最高!

ahartmetz 2025/06/13 19:29:56

>windowsのデフォルトアロケーターはダメダメだ
うわ、まだそうなんだ?10年か15年くらい前のアロケーターベンチマークを覚えてるけど、他のアロケーターとの差が結構あったのに、windowsのは他のどれよりも20%くらいしか性能が出なかったりしてたもんね!

ComputerGuru 2025/06/14 17:24:27

それ以降、かなり改善されてるよ。

int_19h 2025/06/13 20:12:57

>windowsのデフォルトアロケーター
どれのことかな?最近だとHeapAllocを指すこともあれば、uCRTのmallocを指すこともあるしね。

carey 2025/06/13 21:43:01

uCRTのmallocはHeapAllocを呼んでるだけじゃないかな?Windows SDKをインストールしてたら、ucrt\heap\malloc_base.cppのコードを見れるよ。
プログラムはマニフェストで_segment_ heapを使うことも選べるけど、それが必ずしも速いとは限らないね。

chubot 2025/06/13 02:51:29

良い記事だったね。Facebookはもうjemallocを全く使ってないのかな?それともメンテナンスモード?
それか、最近はtcmallocとか他のアロケーターを使ってるのかな。
Facebookのインフラエンジニアリングは、コア技術への投資を減らして、投資対効果を重視するようになったんだよね。

Svetlitski 2025/06/13 04:17:53

MetaではJemallocがめっちゃ深く統合されてて、他のAllocatorに変えるのは超難しいみたいだよ。Meta専用のツール(Strobelightとか)と連携してたり、Jemallocの機能(arenaとかextent hooksとか)使いまくってるからさ。アプリもJemallocに合わせて最適化されてるんだって。

charcircuit 2025/06/13 04:51:53

Metaはまだjemallocのフォークを開発してるらしいよ。ここ見てみて。
https://github.com/facebook/jemalloc

nh2 2025/06/13 12:37:24

記事のポイントは、Metaのjemalloc開発は一般的な用途よりMetaのニーズに偏ってるってことだよ。
記事では「Metaの最近の変化で、一般的な用途を視野に入れた長期開発の主導者がいなくなった」とか「Facebook/Metaの手でjemallocが悲しい結末を迎えた」とか「Metaのニーズは外部ユーザーとずれ始めたから、Metaは自分たちのやり方でやるのが良い」って書いてあるね。

nh2 2025/06/13 12:41:13

でも、具体的にどういう意味なのか知りたいな。Facebookの焦点が自分のニーズと合ってるかどうか、どうやったら分かるんだろう?

ahartmetz 2025/06/13 23:33:18

今はベンチマークで見てみればいいんじゃない?
長期的なことは、過去を見れば推測できると思うよ。

umanwizard 2025/06/13 18:06:55

ReactとかPyTorchとかRocksDBはめちゃくちゃ重要だよ。それに、Linuxカーネルへの最大の貢献者の一つだってことも忘れないでほしいな。

anonymoushn 2025/06/13 06:06:21

大きな変化は、jemallocの長期メンテナーがいなくなったことだね。でも、Facebookからは前より注目されてるらしいよ。最近ちょっと変な方向にも注目が集まっちゃったみたいだけど、今後QiさんやJasonさんが同意するような、外部ユーザーのニーズと合う方向に向かうとちょっと楽観的に見てるんだ。

kstrauser 2025/06/13 02:54:38

前にこれについて疑問に思ったことあるけど、知ってる人が周りにいなくて聞けなかったんだよね。部外者から見ると、今まで見たベンチマークだと、jemallocってglibcのmallocより厳密に改善されてるみたいだった。だから、なんでそれがデフォルトのアロケータじゃないの?

favorited 2025/06/13 03:21:35

免責事項: 僕はアロケータエンジニアじゃないし、これはただの逸話ね。
OSアロケータをメンテしてたエンジニアの話だと、カスタムアロケータって、システム全体の他のプロセスを犠牲にして、ある一つのプロセスのメモリアロケーションを速くする傾向があるらしいんだ。システムアロケータは全体を公平にするのが苦手で。特定のプロセスを優先したいサービスで推奨されるのはそのためだって。

jeffbee 2025/06/13 03:25:46

それはあまり擁護できない主張だと思うよ。jemallocもtcmallocも、特定の圧倒的なアプリケーションが一つだけじゃない、敵対的なマルチテナント環境で進化し洗練されてきたんだ。まさにそういう状況に最適なんだよ。

favorited 2025/06/13 03:48:26

彼らが自分のプラットフォームやそのシステムアロケータについて特定のことだったのかもしれないけど、言った通り、それはあるエンジニアの言葉に関する逸話だったんだ。聞いた時は筋が通ってるって思ったのを覚えてるだけだよ。

vlovich123 2025/06/13 04:54:40

”システム”アロケータはプロセス境界内でメモリを管理してるんだよ。カーネルはプロセス間を管理してるんだ。ユーザー空間のアロケータが貪欲に非効率だなんて主張は、主張してる人がアーキテクチャをよく分かってないことを示唆する、ブードゥーみたいな理屈だよ。

sanxiyn 2025/06/13 03:00:13

僕が知る限り、jemallocがデフォルトのアロケータであるべきでない技術的な理由は何も無いよ。実際、記事で指摘されてるように、FreeBSDではデフォルトなんだ。僕の理解では、それは主に政治的なものだと思うな。

もっとコメントを表示(2)
kstrauser 2025/06/13 03:49:28

そういえば、Hurdとかではビルドできないからglibcから外されてるってのは簡単に想像できるな。

o11c 2025/06/13 04:29:08

長い間、代替アロケータの大きな問題は、フリーメモリをOSに戻さずプロセス内に保持することだったんだ。これは変わったけど、優先順位の違いを示してるね。
あと、多くのプロセスはシングルスレッドか、ほとんど何もしないバックグラウンドスレッドしかない。だから”マルチスレッド優先アロケータ”は価値がなく、オーバーヘッドが大きいんだ。
余談だけど、ページのゼロ化作業量はカーネルもユーザーランドも同じだよ。

lloeki 2025/06/13 06:41:46

glibcに入らなかったのって、BSD-2-Clauseライセンスだからじゃないの?それが「政治的」ってことかぁ。

vkazanov 2025/06/13 07:00:40

えっ?BSDライセンスってGPLと互換性あるじゃん。
問題はFacebookがシステムの大事な部分の元締めになっちゃうことだよ。
Facebookは今回みたいにすぐやめちゃえるしね。

jdsully 2025/06/13 05:21:32

「貪欲」って言ってるのは、たぶんメモリをすぐにOSに返さないことじゃない?

nicoburns 2025/06/13 09:45:13

それって変だね。
だってそれってglibcのアロケータの主な批判の一つだからさ。

lloeki 2025/06/13 07:20:32

互換性はあるけど、そこがキモじゃないんだよ。
もしglibcに入ったら、後で追加されるコードとかでLGPLのハードフォークになっちゃう。
それに、この壁もあるし→ https://sourceware.org/glibc/wiki/CopyrightFSForDisclaim AppleがC blocksをGCCに戻せなかったのもこれが理由だったような。

senderista 2025/06/13 07:09:41

ちょっと関連する話だけど、あまり考えないこと。
カーネルがメモリをゼロクリアするのと、ユーザーが自分のためにゼロクリアするのって、作業量は同じなんだ。
カーネルはSIMDを使えないから、もしかしたらユーザーの方が楽かもね。

jeffbee 2025/06/13 13:09:41

こういうアロケータが生まれたコンテナ環境だと、メモリをOSに返してもほとんど意味ないよ。
コンテナが使える分は全部持ってた方がいいって。
だって他のコンテナが使えないし、使えるメモリ量は決まってるんだから。

vkazanov 2025/06/13 10:52:39

AppleがGPL系のコードを嫌うのは、オープンにしないと使えないからだよ。
コードの管理権を手放したくないんだね。
Llvmは大丈夫。元はオープンだけど、自分たちだけのバージョンを作って配れるからさ。

LtdJorge 2025/06/13 09:47:20

えっ、なんで?
Linuxって暗号化にはSIMD使ってるんじゃないの?

lloeki 2025/06/13 12:30:12

AppleがGPL嫌いってわけじゃなくね?
C blocksの件では、Appleはgccパッチを戻そうとしたけど、FSFが著作権を自分によこせってゴネて揉めたんだよ。
ホントにGPL嫌いなら、そんなことしないって。
嫌いになったのは、GPLv3とかFSFのポリシーが出てきてからだよ。
Lwnの記事にも書いてある→ https://lwn.net/Articles/405417/ FSFの著作権ポリシーが問題なんだ。

dwattttt 2025/06/13 12:34:43

カーネルでSIMD命令を勝手に使うと、結構なペナルティがあるんだよ。Linuxが具体的にどうしてるかは知らないけどさ。syscallする時、カーネルはスレッドのユーザーモードの状態をバックアップして、後で戻せるようにする必要があるんだ。もしカーネルコードがSIMDレジスタも使っていいなら、それもバックアップ・リストアしなきゃいけないんだけど、そのレジスタがデカいんだよね。簡単に syscall ごとに1KBのコピーが増える可能性があって、たいていの場合はそんなの要らないのにね。

lmm 2025/06/13 07:22:27

>jemalloc と tcmalloc は、一つの圧倒的なアプリケーションがない敵対的なマルチテナント環境で進化・洗練されたんだ。そういう状況にまさに最適なんだよ。
彼らは主に Facebook/Google のサーバーサイドシステムで最適化されたんでしょ? それってVMごとにアプリケーションが一つとかだったんじゃない?(ユーザーが複数のアプリケーションを協調して動かしたいデスクトップ利用とは違って)。Firefox は違うケースだけど、どうも本流の jemalloc は Firefox 版には敵わなかったみたいだし、それにしても Firefox は”自己中心的”なアロケーターで恩恵を受けただけって可能性も十分あるよね。

kstrauser 2025/06/13 14:03:43

なんでそうなの? syscall 自体がSIMD呼び出しの周りでpush_simd() \ pop_simd()みたいなのを使えばいいんじゃない?
もし今syscallがSIMDを使ってないなら、安全な位置から始められると思うけどな。

favorited 2025/06/13 05:57:41

ちなみに、僕が話してた”allocator engineer”はカーネルエンジニアだったんだ。彼らは自分のプラットフォームのアーキテクチャをものすごくよく理解してるよ。
プラットフォームのシステムアロケーターであることの最大の利点は、ライブラリ関数とカーネル実装の間に密な関係を持てることなんだ。

toast0 2025/06/13 16:03:01

もう使わなくなった匿名メモリを解放することには、メリットがちゃんとあるんだ。
ページを返すと、ディスクキャッシュとして使えるようになる。カーネルがバックグラウンドでゼロクリアしておけば、また必要になった時に時間を節約できるかもしれないし、もしカーネルがフルページDMAライトの宛先として使うならゼロクリアを回避できる可能性もある。
それに、使われなくなったページを返すのは、より正確なメモリ使用量の測定に近づく手助けになるよ。もちろんメモリ使用量の測定はかなり難しいけど、数字が少しでも正確になるのは助かるよね。

jeffbee 2025/06/13 03:06:37

これらのアロケーターは、起動コストが高いことが多いんだ。定常状態での高いパフォーマンス向けに設計されてるから、unixスタイルで短命なプロセスをたくさん起動するようなワークロードには向かない可能性があるね。

lloeki 2025/06/13 17:06:32

あれは皮肉だよ、Darth Vaderの声で分かったと思ったんだけどな。
でもライセンス変更は実際に起こるし、それで大騒ぎになることもあるよね。redisの件を思い出して。
著作権譲渡の原因は、実践的な理由(すべての作者や貢献者を追跡・連絡して回答を集めるのが大変で、その後の重要な決定が滞る)や思想的な理由(FSFにとってはGCCのソースコードはFSF単独の管理下に置かれなければならない)がある。
でも、著作権を放棄する作者たちは、その譲渡の結果をよく理解してないんだ。本質的には、コードベースが将来どういうライセンスになろうと、たとえ完全にクローズドソースになったとしても、無償で働き続けることに同意してるってことなんだよ。
次にCLAに署名する時は、このことを考えてみて!

jeffbee 2025/06/13 08:03:23

Googleは、”borg”の中で、1台のマシンで何十、何百もの無関係なワークロードを軽量コンテナで動かしてるんだよ。Facebookも”tupperware”っていう似たようなものを持ってるし。

atombender 2025/06/14 19:04:11

Googleには素晴らしいエンジニアリングがあるのは知ってるけど、これはちょっと信じがたいな?
ほとんどのアプリケーション、特にウェブサーバーみたいなリクエスト/レスポンス型のアプリでは、ピーク時を考慮してメモリサイズを真に正確に調整するのって、単一のリクエストに必要なアロケーション量を完全に考慮して、同時最大リクエスト数がそれを超えないようにしてOOMを防ぐリスクをなくすために、すごくエンジニアリングの労力がかかるんだ。
ロードバランサー、SDN、ファイルシステムみたいな極めて高スケールなコアサービスなら、これはうまくいくかもしれないね(多分、起動時にデータ構造を全部アロケートして、その後は何もアロケートしないようにして、多分それだけで何チームものエンジニアが専従してるんだろうけど)。でも、ほとんどのアプリではそうじゃないでしょ?
コンテナがシステムメモリを共有して、制限やリソース駆動のオートスケーリングに頼る方が、システムの回復力にとっては良いはずじゃない?

記事一覧へ

海外テックの反応まとめ
著者
海外テックの反応まとめ
暇つぶしがてらに読むだけで海外のテックニュースに詳しくなれるまとめサイトです。