プロフィール

kosaki

Author:kosaki
連絡先はコチラ

ブログ検索
最近の記事
最近のコメント
最近のトラックバック
リンク
カテゴリー
月別アーカイブ
RSSフィード
FC2ブログランキング

スポンサーサイト このエントリーをはてなブックマークに追加

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


スポンサー広告 | 【--------(--) --:--:--】 | Trackback(-) | Comments(-)

glibc 2.10 news このエントリーをはてなブックマークに追加

元はUlrichのBlog
時期的に考えると、Fedora11/RHEL6用のlibcになるのかな?

http://udrepper.livejournal.com/20948.html

以下、要約

・strchrの実装を変えたよ。
strchrは規格上

 char *strchr(const char *, int)

 のようなプロトタイプをもつけども、これはCがオーバーローディングをサポートしない事による制限で
 本来は

  char *strchr(char *, int)
  const char *strchr(const char *, int)

 の2つをサポートするべき。gccトリックによってCでこれを実現したよ。

・C++ 201x support

デストラクタを呼ばない quick_exit() とそれ用のat_exit()の変種、at_quick_exit()が追加されたので実装したよ

int at_quick_exit(void (*)(void))
void quick_exit(int)

・DNS NSS improvement
2.9でIPv4とIPv6の名前解決をパラレルにやるようにして性能向上させたんだけど、腐れDNSが狂った返事をしたときが問題だった。そういう時のフォールバック論理を実装したよん

・Use NSS in libcrypt
 ※ よくわからん。なんかの認証の問題なの?

・printf hooks
 decimal floating point computationsの規格をつくったバカがいるけどサポートしたくないから、
 代わりに汎用のprintf フックを作ったぜ。
 好きなmodifierを実装してくれ

・malloc scalability (※1)
いままでは、per-core memory pool をエミュレートしてたよ。んで、malloc時に競合したら
(trylockが失敗したら)新しいpoolをつくってた。
これは、競合が発生しないかぎり2つのスレッドが同じpoolを使うのでfalse sharing (※2)に
 よって、 キャッシュ競合が発生して性能が落ちてた。だから、発想を転換して per-threadな
 pool を作る事にしたよ。
 でも、無造作にper-thread poolを作ると32bit machineでアドレス空間が足りなくなるので
core数 x2 (64bitではcore数 x8) にpool 数を制限する論理をいれたよ。
core数のチェックは/proc/statを読む必要があり重い処理なので出来る限り遅延させるよ。

 この変更はmemory pool数を増加させると思うけど、古いメカニズムはプール数に上限が
 なかったので、競合がたくさん発生した場合のワーストケースは古いほうが悪かった。だから
 これは改善なんだぜい

 dlmallocをglibcに移植した当時(1995)はメモリ64Mとかでアドレス空間の問題なんで全然
 考えてなかった。

 あと、free関数でいらないと判断できるときは、lockをとらないようにしたよ(※3)

内部での測定では、すごい性能改善が観測されているぜ


※1 ようするに昔、話題になったMySQLとの相性の悪さを直したってことだと思う。Google Malloc
に変えたら性能上がった。とか話題になったよね
※2  こういうのはtrue sharingだろーが。false sharingってのは論理上は同じ変数へのアクセスはないんだけれど、2つの変数が同じCPUキャッシュラインに載る事により、競合する状態だ。
glibc mallocは同じ変数さわっとるやんけ。
※3 おさらい。昔のglibcの論理は競合をmallocでtrylock使うことにより検出。freeは普通にlock取ってた。そうすると、ライブラリの都合とかでmalloc呼び出し元が共通mutexをとってると、mallocでは絶対競合せずに、freeで競合しまくる。というのがMySQL問題。だから、1.競合検出をまたずに別poolに追い出す。 2.不要なfreeのlockをはずす が重要になってくる。ソース読んでないので誤解してるかもしれんが

・Information about malloc

glibcがmallinfoと呼んでいるSysVの隠し機能がある。これはmallocの統計値(アロケートメモリ量、トータルアドレス空間、等)が取得できる。
でも、SysVの定義が腐っていて 2^31 以上の値がハンドルできないので、64bit環境では全然使い物にならなかった。

なので、構造体をexportするのはもうやめて、代わりに取得関数を提供する事にしたよ。

・Automatic use of optimized function

SSE4.2 (Nehalem)ではstring命令が追加されてるけど、strlenとかstrchrとかの個々の関数でSSE命令の有無を判定するなんてばかげてるぜ。
この判定で浪費した数十サイクルはメリットを台無しにしてしまうから。

その代わりに新しいELFシンボルを導入して、シンボルルックアップ時に1回だけ判定、SSEバージョンと通常バージョンのどちらをルックアップするか変えるよ

関連記事


linux | 【2009-04-18(Sat) 16:42:29】 | Trackback:(0) | Comments:(2)
コメント

C++201x 。。。さらっと言われてしまった。そうだけど。
2009-04-18 土 03:29:38 | URL | redboltz #- [ 編集]

実は僕も気になってたんだけど、あまりにオフトピックなのでスルーした。スルー力を試されてるんですよ!!
2009-04-18 土 04:04:45 | URL | kosaki #- [ 編集]
  1. 無料アクセス解析
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。