Skip to content

Instantly share code, notes, and snippets.

@davidsmalley
Created June 20, 2012 11:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save davidsmalley/a80ffa3126c5b1b01d27 to your computer and use it in GitHub Desktop.
Save davidsmalley/a80ffa3126c5b1b01d27 to your computer and use it in GitHub Desktop.
Garbage Collection Bug
$ ps aux | grep Rack
deploy 2742 99.7 2.8 286916 117420 ? Rl 07:58 193:57 Rack: /home/deploy/litmus/current
deploy 15693 99.6 3.1 298468 128828 ? Rl Jun19 881:50 Rack: /home/deploy/litmus/current
deploy 24979 2.3 3.2 301364 131732 ? Sl 10:59 0:19 Rack: /home/deploy/litmus/current
deploy 25426 4.3 3.2 368756 134328 ? Sl 11:03 0:24 Rack: /home/deploy/litmus/current
$ passenger-status
----------- General information -----------
max = 52
count = 4
active = 2
inactive = 2
Waiting on global queue: 0
----------- Application groups -----------
/home/deploy/litmus/current:
App root: /home/deploy/litmus/current
* PID: 26593 Sessions: 0 Processed: 176 Uptime: 4m 49s
* PID: 24979 Sessions: 0 Processed: 288 Uptime: 20m 23s
* PID: 15693 Sessions: 1 Processed: 115 Uptime: 14h 51m 30s
* PID: 2742 Sessions: 1 Processed: 10 Uptime: 3h 20m 55s
^^ Two processes running the longest have the lowest number of processed requests - and also have active (presumably stuck) sessions
Inspecting further...
# gdb ruby
<snip>
(gdb) attach 2742
Attaching to program: /usr/bin/ruby, process 2742
<snip>
(gdb) bt
#0 0x00007fd2874bc1d5 in find_entry (key=94758960, hash_val=94758960, bin_pos=<optimized out>, table=<optimized out>) at st.c:451
#1 0x00007fd2874bcac6 in st_lookup (table=0x165e158, key=94758960, value=0x7fffa5dec218) at st.c:505
#2 0x00007fd2874ec800 in rb_mark_generic_ivar (obj=<optimized out>) at variable.c:910
#3 0x00007fd287429f2f in gc_mark_children (objspace=0x1566990, ptr=94758960, lev=3) at gc.c:1868
#4 0x00007fd28742a423 in gc_mark_children (objspace=0x1566990, ptr=<optimized out>, lev=2) at gc.c:2063
#5 0x00007fd28742a3ab in gc_mark_children (objspace=0x1566990, ptr=<optimized out>, lev=1) at gc.c:2030
#6 0x00007fd28742a712 in mark_locations_array (objspace=0x1566990, x=0x63fe6a0, n=<optimized out>) at gc.c:1603
#7 0x00007fd2875013ee in env_mark (ptr=0x63fe960) at vm.c:247
#8 0x00007fd287429f82 in gc_mark_children (objspace=0x1566990, ptr=95505920, lev=1) at gc.c:2054
#9 0x00007fd28742a712 in mark_locations_array (objspace=0x1566990, x=0x63fe738, n=<optimized out>) at gc.c:1603
#10 0x00007fd2875013ee in env_mark (ptr=0x63fe6d0) at vm.c:247
#11 0x00007fd287429f82 in gc_mark_children (objspace=0x1566990, ptr=95505760, lev=1) at gc.c:2054
#12 0x00007fd28741e325 in proc_mark (ptr=0x63fe7a0) at proc.c:54
#13 0x00007fd287429f82 in gc_mark_children (objspace=0x1566990, ptr=95505520, lev=11) at gc.c:2054
#14 0x00007fd28742a86a in mark_method_entry_i (key=<optimized out>, me=<optimized out>, data=<optimized out>) at gc.c:1732
#15 0x00007fd2874be20e in st_foreach (table=0x6633bc8, func=0x7fd28742a850 <mark_method_entry_i>, arg=140735976228208) at st.c:1181
#16 0x00007fd28742a24c in mark_m_tbl (lev=10, tbl=<optimized out>, objspace=0x1566990) at gc.c:1743
#17 gc_mark_children (objspace=0x1566990, ptr=63894080, lev=10) at gc.c:2014
#18 0x00007fd287429dbf in gc_mark_children (objspace=0x1566990, ptr=63894120, lev=9) at gc.c:2009
#19 0x00007fd28742a3ab in gc_mark_children (objspace=0x1566990, ptr=<optimized out>, lev=8) at gc.c:2030
#20 0x00007fd28742a8d0 in mark_keyvalue (key=<optimized out>, value=36477040, data=<optimized out>) at gc.c:1679
#21 0x00007fd2874be20e in st_foreach (table=0x2843ec8, func=0x7fd28742a8a0 <mark_keyvalue>, arg=140735976228608) at st.c:1181
#22 0x00007fd287429fd4 in mark_hash (lev=7, tbl=<optimized out>, objspace=0x1566990) at gc.c:1690
#23 gc_mark_children (objspace=0x1566990, ptr=36432280, lev=7) at gc.c:2036
#24 0x00007fd28742a902 in mark_entry (key=<optimized out>, value=<optimized out>, data=<optimized out>) at gc.c:1636
#25 0x00007fd2874be289 in st_foreach (table=0x2843e68, func=0x7fd28742a8f0 <mark_entry>, arg=140735976228784) at st.c:1153
#26 0x00007fd287429710 in mark_tbl (lev=<optimized out>, tbl=<optimized out>, objspace=<optimized out>) at gc.c:1647
#27 mark_tbl (objspace=<optimized out>, tbl=<optimized out>, lev=<optimized out>) at gc.c:1641
#28 0x00007fd28742a268 in gc_mark_children (objspace=0x1566990, ptr=36432400, lev=6) at gc.c:2016
#29 0x00007fd287429dbf in gc_mark_children (objspace=0x1566990, ptr=36410760, lev=5) at gc.c:2009
#30 0x00007fd287429dbf in gc_mark_children (objspace=0x1566990, ptr=35578840, lev=4) at gc.c:2009
#31 0x00007fd28742a896 in mark_const_entry_i (key=<optimized out>, ce=<optimized out>, data=<optimized out>) at gc.c:1766
#32 0x00007fd2874be20e in st_foreach (table=0x2813748, func=0x7fd28742a880 <mark_const_entry_i>, arg=140735976229216) at st.c:1181
#33 0x00007fd28742a290 in mark_const_tbl (lev=3, tbl=<optimized out>, objspace=0x1566990) at gc.c:1777
#34 gc_mark_children (objspace=0x1566990, ptr=35536480, lev=3) at gc.c:2017
#35 0x00007fd28742a896 in mark_const_entry_i (key=<optimized out>, ce=<optimized out>, data=<optimized out>) at gc.c:1766
#36 0x00007fd2874be20e in st_foreach (table=0x2429dc8, func=0x7fd28742a880 <mark_const_entry_i>, arg=140735976229408) at st.c:1181
#37 0x00007fd28742a290 in mark_const_tbl (lev=2, tbl=<optimized out>, objspace=0x1566990) at gc.c:1777
#38 gc_mark_children (objspace=0x1566990, ptr=26531600, lev=2) at gc.c:2017
^^ Stuck in Garbage collection - then the other process
(gdb) attach 15693
(gdb) bt
#0 st_numcmp (x=124727520, y=481) at st.c:1713
#1 0x00007fd2874bd748 in st_delete (table=0x165e158, key=0x7fffa5df13b0, value=0x7fffa5df13b8) at st.c:894
#2 0x00007fd2874ec871 in rb_free_generic_ivar (obj=<optimized out>) at variable.c:945
#3 0x00007fd28742ba85 in obj_free (obj=124727520, objspace=<optimized out>) at gc.c:2486
#4 slot_sweep (objspace=0x1566990, sweep_slot=0x6e3a520) at gc.c:2227
#5 0x00007fd28742c7ef in gc_sweep (objspace=0x1566990) at gc.c:2431
#6 garbage_collect (objspace=0x1566990) at gc.c:2716
#7 0x00007fd28742cac1 in vm_malloc_prepare (size=16424, objspace=0x1566990) at gc.c:813
#8 vm_xcalloc (elsize=<optimized out>, count=<optimized out>, objspace=0x1566990) at gc.c:939
#9 ruby_xcalloc (n=<optimized out>, size=<optimized out>) at gc.c:948
#10 0x00007fd2874bc2ae in st_alloc_bins (size=2053) at st.c:101
#11 st_realloc_bins (oldsize=<optimized out>, newsize=<optimized out>, bins=<optimized out>) at st.c:116
#12 rehash (table=0x165e158) at st.c:778
#13 0x00007fd2874bd440 in add_direct (bin_pos=<optimized out>, hash_val=135069160, value=131213336, key=135069160, table=0x165e158) at st.c:576
#14 st_add_direct (table=0x165e158, key=135069160, value=131213336) at st.c:768
#15 0x00007fd2874ecb1b in generic_ivar_set (val=<optimized out>, id=<optimized out>, obj=<optimized out>) at variable.c:863
#16 rb_ivar_set (obj=135069160, id=66169, val=2) at variable.c:1105
#17 0x00007fd2875071f6 in vm_setivar (ic=0x22f6530, val=2, id=66169, obj=135069160) at vm_insnhelper.c:1363
#18 vm_exec_core (th=<optimized out>, initial=<optimized out>) at insns.def:172
#19 0x00007fd28750b59d in vm_exec (th=0x1566610) at vm.c:1220
#20 0x00007fd28750c7cd in vm_call0 (th=0x1566610, recv=<optimized out>, id=456, argc=1, argv=0x7fd2878e7d60, me=0x25e4a30) at vm_eval.c:66
#21 0x00007fd28745be00 in rb_class_new_instance (argc=1, argv=0x7fd2878e7d60, klass=<optimized out>) at object.c:1636
#22 0x00007fd28750ed41 in vm_call_cfunc (me=0x15694f0, blockptr=0x0, recv=<optimized out>, num=1, reg_cfp=0x7fd2879e24f0, th=<optimized out>) at vm_insnhelper.c:404
#23 vm_call_method (th=<optimized out>, cfp=0x7fd2879e24f0, num=<optimized out>, blockptr=0x0, flag=<optimized out>, id=<optimized out>, me=0x15694f0, recv=28960640) at vm_insnhelper.c:534
#24 0x00007fd287505b52 in vm_exec_core (th=<optimized out>, initial=<optimized out>) at insns.def:1015
#25 0x00007fd28750b59d in vm_exec (th=0x1566610) at vm.c:1220
#26 0x00007fd28751130e in invoke_block_from_c (cref=0x0, blockptr=0x0, argv=0x7fffa5df1a88, argc=1, self=150068240, block=0x7fd2879e2780, th=0x1566610) at vm.c:624
#27 vm_yield (th=0x1566610, argv=0x7fffa5df1a88, argc=1) at vm.c:654
#28 rb_yield_0 (argv=0x7fffa5df1a88, argc=1) at vm_eval.c:760
#29 rb_yield (val=149608840) at vm_eval.c:770
#30 0x00007fd2873e8892 in rb_ary_each (array=136841760) at array.c:1478
#31 0x00007fd28750ed41 in vm_call_cfunc (me=0x1607fa0, blockptr=0x7fd2879e2780, recv=<optimized out>, num=0, reg_cfp=0x7fd2879e2758, th=<optimized out>) at vm_insnhelper.c:404
#32 vm_call_method (th=<optimized out>, cfp=0x7fd2879e2758, num=<optimized out>, blockptr=0x7fd2879e2780, flag=<optimized out>, id=<optimized out>, me=0x1607fa0, recv=136841760) at vm_insnhelper.c:534
#33 0x00007fd287505b52 in vm_exec_core (th=<optimized out>, initial=<optimized out>) at insns.def:1015
#34 0x00007fd28750b59d in vm_exec (th=0x1566610) at vm.c:1220
#35 0x00007fd2875118e6 in invoke_block_from_c (cref=0x0, blockptr=0x0, argv=0x7fffa5df1da0, argc=<optimized out>, self=150068240, block=<optimized out>, th=0x1566610) at vm.c:624
#36 vm_yield (th=0x1566610, argv=0x7fffa5df1da0, argc=<optimized out>) at vm.c:654
#37 rb_yield_0 (argv=0x7fffa5df1da0, argc=<optimized out>) at vm_eval.c:760
#38 rb_yield_values (n=<optimized out>) at vm_eval.c:792
^^ Stuck somewhere else - but still garbage collection? (frame #6 is quite high up and is definitely doing GC)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment