From: Tomoaki NISHIYAMA Date: 2010-08-16T14:18:26+09:00 Subject: [ruby-dev:42042] GC::profiler.report for large memory. バグと言っていいのか分かりませんが、 たくさんメモリーを使ってから GC::profiler.reportを呼ぶと、 in `report': integer 6411976704 too big to convert to `int' (RangeError) といっておこられました。 負の数はなさそうなので、unsigned longにするパッチを作りま した。 結果は GC 4 invokes. Index Invoke Time(sec) Use Size(byte) Total Size (byte) Total Object GC Time(ms) 1 63.975 800157160 6411943936 160063786 6110.07100000000536965672 のように出ています。一回しかないのは、GC.disable; 仕事一 杯;GC.enable;GC.start のシーケンスで実行しているのでいいです。 # 停止時間はそれなりにあっても良いけどN GbytesまでGC しないとかで、スループットが上がると嬉しい人。 GC 4 invokesの4回って言うのはGC.disableのような呼び出しも 数えているんですかね?? $ diff -u ruby-1.9.2-rc2/gc.c ruby-1.9.2-rc2p/gc.c --- ruby-1.9.2-rc2/gc.c 2010-06-06 23:46:39.000000000 +0900 +++ ruby-1.9.2-rc2p/gc.c 2010-08-16 13:31:08.000000000 +0900 @@ -3091,11 +3091,11 @@ rb_str_cat2(result, "Index Invoke Time(sec) Use Size (byte) Total Size(byte) Total Object GC Time(ms)\n"); for (i = 0; i < (int)RARRAY_LEN(record); i++) { VALUE r = RARRAY_PTR(record)[i]; - rb_str_catf(result, "%5d %19.3f %20d %20d %20d %30.20f\n", + rb_str_catf(result, "%5d %19.3f %20lu %20lu %20lu %30.20f \n", i+1, NUM2DBL(rb_hash_aref(r, ID2SYM(rb_intern ("GC_INVOKE_TIME")))), - NUM2INT(rb_hash_aref(r, ID2SYM(rb_intern ("HEAP_USE_SIZE")))), - NUM2INT(rb_hash_aref(r, ID2SYM(rb_intern ("HEAP_TOTAL_SIZE")))), - NUM2INT(rb_hash_aref(r, ID2SYM(rb_intern ("HEAP_TOTAL_OBJECTS")))), + NUM2ULONG(rb_hash_aref(r, ID2SYM(rb_intern ("HEAP_USE_SIZE")))), + NUM2ULONG(rb_hash_aref(r, ID2SYM(rb_intern ("HEAP_TOTAL_SIZE")))), + NUM2ULONG(rb_hash_aref(r, ID2SYM(rb_intern ("HEAP_TOTAL_OBJECTS")))), NUM2DBL(rb_hash_aref(r, ID2SYM(rb_intern ("GC_TIME"))))*1000); } #if GC_PROFILE_MORE_DETAIL -- Tomoaki NISHIYAMA Advanced Science Research Center, Kanazawa University, 13-1 Takara-machi, Kanazawa, 920-0934, Japan