Show enters and exits. Hide enters and exits.
| 02:17:47 | evan | ok, found a GC issue. |
| 02:17:51 | evan | that dbussink pointed out. |
| 02:18:08 | evan | gotta figure out how to fix it now. |
| 02:18:39 | slava | evan! |
| 02:18:44 | evan | senior slava. |
| 02:18:47 | slava | do you plan on adding callcc to rbx? |
| 02:18:52 | evan | in the bits |
| 02:19:01 | evan | (thats like in the flesh, but for IRC) |
| 02:19:07 | evan | yeah, i do. |
| 02:19:17 | slava | by copying stacks, or something else? |
| 02:19:20 | evan | using pretty much the same technique you use |
| 02:19:25 | evan | hoist the stack to the heap |
| 02:19:37 | slava | I guess callcc isn't used all that much in ruby code |
| 02:19:42 | evan | with some metadata to be able to walk it properly |
| 02:19:49 | evan | nope, it's not used at all. |
| 02:20:31 | slava | also, what's with the architecture block diagrams on the web site? :) |
| 02:20:40 | evan | you know you want one |
| 02:20:47 | evan | i can get you good price on one. |
| 02:20:54 | evan | i gotta friend. |
| 02:22:25 | evan | hows NZ? |
| 02:22:34 | evan | still just hanging out or did you get a job? |
| 02:22:36 | slava | so you'll need a way to walk the callstack and identify frames? |
| 02:22:45 | slava | how will this work for interpreter/native frames? |
| 02:23:37 | evan | they're the same currently |
| 02:23:43 | evan | so easily. |
| 02:23:50 | evan | as for the callstack |
| 02:24:01 | evan | every stack has a CallFrame* linked list thats laced on it |
| 02:24:13 | evan | the list points to addresses within the stack |
| 02:24:17 | slava | right |
| 02:24:21 | evan | so when you copy the stack to the heap |
| 02:24:30 | evan | you know what the start and destination addresses were |
| 02:24:46 | evan | so you can walk it like normal, just adjusting pointers |
| 02:25:02 | slava | and when you copy it back, you know its going to start at the same base offset? |
| 02:25:28 | evan | yeah, i'd restrict restore a continuation to the same thread that created it |
| 02:25:32 | evan | restoring, rather. |
| 02:25:40 | slava | ah |
| 02:25:40 | evan | and therefore the same base stack address |
| 02:25:52 | evan | could probably work it out restore on any thread |
| 02:26:06 | evan | but for a first cut, no cross threading |
| 02:26:07 | slava | suppose you have the following call stack: |
| 02:26:11 | evan | i think MRI already doesn't allow that |
| 02:26:19 | slava | JITted method -> C++ code in VM -> JITted method |
| 02:26:30 | slava | and the C++ code has a GC root in its stack frame |
| 02:26:40 | slava | how will you trace that after the continuation was captured into the heap |
| 02:26:41 | evan | then it's registered elsewhere |
| 02:26:53 | evan | i don't support (nor will I) stack roots in unmanaged frames |
| 02:27:09 | evan | that C++ code would have to have used OnStack<> |
| 02:27:21 | evan | which registers the stack locations into a thread local list |
| 02:27:47 | evan | and that list would have to be made aware of potential pointer adjustments |
| 02:27:52 | slava | ok |
| 02:27:53 | evan | which isn't too bad. |
| 02:28:41 | slava | in factor, VM frames can never mix with JITted frames |
| 02:28:52 | evan | i almost never do |
| 02:29:00 | slava | the VM frames are always at the top, if there are any |
| 02:29:01 | evan | it's extremely restricted. |
| 02:29:03 | evan | and hard to do |
| 02:29:06 | evan | on purpose. |
| 02:29:15 | slava | and continuations are only captured directly from JITted code |
| 02:29:23 | slava | so VM frames never end up in a callstack object in the heap |
| 02:29:25 | evan | yep |
| 02:29:36 | evan | thats pretty much the same setup we have |
| 02:29:39 | slava | so I control the layout of every frame in a continuation directly |
| 02:30:06 | slava | also there are no pointers between stack frames, instead every stack frame stores a length in bytes |
| 02:30:16 | slava | so there's no fixup to do if a continuation isrestored at a different base address |
| 02:30:24 | slava | this can happen if you capture a continuation, save the image, start a new session, and restore it |
| 02:30:48 | evan | ah, gotcha. |
| 02:31:40 | evan | slava: you gc immediately when you detect that you're out of memory, yes? |
| 02:36:25 | slava | evan: when the heap is full, yeah. remember I have one big heap where everything lives |
| 02:36:44 | evan | yep yep |
| 02:36:51 | evan | i just mean |
| 02:36:54 | evan | do you have a red zone |
| 02:37:00 | evan | where you then set a flag to say "gc soon!" |
| 02:37:07 | evan | or is it "HOLY SHIT NO SPACE GC NOW!!" |
| 02:37:14 | slava | the latter |
| 02:37:21 | slava | GC doesn't allocate while its GCing, so it works out OK |
| 02:37:35 | evan | right |
| 02:37:44 | evan | means that all allocation points are safe points |
| 02:37:53 | slava | yeah |
| 02:38:15 | slava | I used to have a 'red zone' thingy before I had the data_root<> stuff worked out; VM primitives couldn't run GC at arbiary points because of on-stack roots |
| 02:39:05 | evan | so what is a VM prim does an allocation in the middle of some code |
| 02:39:07 | evan | and there is no space |
| 02:40:05 | slava | then it runs GC before allocating |
| 02:40:20 | evan | so if it does 2 allocations |
| 02:40:21 | slava | since that's safe now, all references to objects from local vars in C++ Code are wrapped in data_root<> |
| 02:40:26 | evan | it has to be sure to stack the first in a data_root<> |
| 02:40:29 | evan | er. |
| 02:40:32 | evan | s/stack/stash/ |
| 02:40:32 | slava | yes |
| 02:40:46 | slava | otherwise it might lose the first one |
| 02:40:55 | evan | yep |
| 02:41:27 | slava | this leads to hard to track down bugs if I forget to data_root<> something |
| 02:41:43 | evan | yeah, course. |
| 02:42:55 | slava | of course if a GC doesn't free up enough memory for the new allocation, it grows the heap |
| 02:43:36 | evan | do you still use that longjmp to grow the heap? |
| 02:44:02 | slava | yeah, GC can fail half-way through like that |
| 02:44:11 | slava | suppose its doing a minor collection, copying form nursery to aging |
| 02:44:15 | slava | and aging fills up before it sdone |
| 02:44:21 | slava | then it aborts and starts doing an aging GC |
| 02:44:53 | evan | right |
| 02:45:35 | slava | your tenured space is 'infinite' because you just malloc more memory whe nyou need to, right? |
| 02:46:06 | evan | yeah |
| 02:46:26 | evan | though i've been thinking about the one big-ass-flat-memory-space more and more lately |
| 02:46:47 | slava | there's a serious disadvantage to that on 32-bit systems |
| 02:46:58 | slava | while you're growing the heap, both the old and new heaps are in your addr space at the same time |
| 02:47:12 | slava | which means your maximum heap size is limited |
| 02:47:20 | rue | http://blog.llvm.org/2010/01/x86-disassembler.html |
| 02:47:36 | slava | evan: one approach I want to try is to allocate a big-ass heap on startup, as large as possible |
| 02:47:39 | evan | slava: right, meaning if you want a 2G+ heap |
| 02:47:48 | slava | evan: but only use the part up to an allocation pointer |
| 02:47:50 | evan | slava: yeah, thats what i'm thinking |
| 02:47:54 | slava | evan: then growing the heap means bumping that pointer |
| 02:47:59 | evan | figure out how to play some mmap/VirtualAlloc tricks |
| 02:48:01 | slava | which commits more pages to memory as they get written to |
| 02:48:05 | evan | to get a huge chunk |
| 02:48:10 | evan | but with uncommited pages |
| 02:48:14 | slava | yeah |
| 02:48:27 | evan | perhaps i'll do some experiments with that tonight |
| 02:48:34 | slava | the only platform I'm aware of where this won't work is Windows CE |
| 02:48:35 | evan | the biggy with that is the ability to uncommit pages |
| 02:48:36 | slava | no overcommit |
| 02:48:51 | slava | what makes you lean towards a flat heap now? |
| 02:49:10 | evan | it could simpify some things |
| 02:49:18 | evan | would simplify write barriers too. |
| 02:49:26 | slava | thinking of card marking then? |
| 02:49:30 | evan | yeah |
| 02:49:36 | slava | cool |
| 02:49:38 | evan | with everything in one address range |
| 02:49:40 | evan | might as well |
| 02:52:53 | slava | so if you have one huge heap that's allocated on startup, you'd uncommit pages past the end after a compaction, right? |
| 02:53:12 | evan | well, when you start up |
| 02:53:17 | evan | you get one big range, say, 1G |
| 02:53:21 | slava | yeah |
| 02:53:25 | evan | starting at 0x1000 |
| 02:53:34 | evan | it's all uncommited though |
| 02:53:47 | evan | so you'd probably say "ok, i want 15% for young, etc" |
| 02:54:03 | evan | so you'd probably put the young objects at the front |
| 02:54:17 | evan | and then leave room between the end of the young objects and the start of the old |
| 02:54:24 | evan | so you can inflate young if you need to |
| 02:54:33 | evan | by just writing into the uncommited pages |
| 02:54:40 | slava | I never resize young dynamically, since I'm not sure what a good heuristic is |
| 02:54:51 | evan | sure |
| 02:54:53 | evan | thats an option too |
| 02:55:00 | slava | one downside of the 1GB heap thing is that you might cause problems for people who want to mmap large files |
| 02:55:35 | evan | right |
| 02:55:38 | evan | it's got downsides for sure |
| 02:56:29 | slava | also you can't delay GC until the heap is full obviously; you'd have a high water mark |
| 02:56:47 | evan | right |
| 02:56:52 | evan | ok, we'll have to suspend this |
| 02:56:56 | evan | i want to continue it though |
| 02:56:59 | evan | it's dinner time. |
| 02:57:02 | slava | enjoy |
| 03:40:15 | rue | Looks like rubini.us has propagated |
| 04:25:38 | wayneeseguin | evan: oh hell yeah : http://rvm.beginrescueend.com/benchmarks/2010-01-06/ |
| 04:25:48 | wayneeseguin | lol so much for PM |
| 04:25:52 | wayneeseguin | rue: ^ |
| 04:26:47 | wayneeseguin | brixen: ^ |
| 04:33:24 | mistergibson | congratulations, that is impressive |
| 04:41:21 | wayneeseguin | It's not a complete benchmark suite yet but we'll definitely get there soon |
| 08:03:47 | dbussink | evan: still some time spec failures for me, because i'm in a different tz |
| 08:04:00 | evan | oh hm. |
| 08:04:01 | evan | ok |
| 08:04:05 | dbussink | Time.mktime(1900, 12, 31, 23, 59, 59, 0) => Mon Dec 31 23:59:59 +0019 1900 on mri |
| 08:04:09 | evan | dbussink: found your GC bug. |
| 08:04:17 | evan | spend most of the afternoon poking around |
| 08:04:19 | dbussink | but Time.mktime(1900, 12, 31, 23, 59, 59, 0) => Tue Jan 01 00:19:31 +0100 1901 on rbx |
| 08:04:37 | dbussink | evan: ah ok, the sleep leak one or the one i saw probably when running datamapper specs? |
| 08:04:44 | evan | sleep |
| 08:05:08 | dbussink | ah ok |
| 08:05:13 | dbussink | tricky issue? |
| 08:05:47 | evan | completely unrelated to sleep |
| 08:05:48 | evan | actually |
| 08:05:50 | evan | and Channel |
| 08:06:22 | dbussink | ah ok, a generic issue? |
| 08:06:29 | evan | and everything else that uses the immix GC. |
| 08:06:39 | evan | immix GC was not reusing space properly |
| 08:06:45 | dbussink | ah! looks like i uncovered something then ;) |
| 08:06:49 | evan | very much so |
| 08:06:56 | evan | Channel's are allocated mature |
| 08:07:00 | evan | so they really hammered it |
| 08:07:04 | evan | and so we saw it. |
| 08:09:05 | dbussink | deliberately allocated as mature then |
| 08:09:06 | dbussink | ? |
| 08:09:40 | evan | well, it just causes a big load on the GC |
| 08:09:49 | evan | and caused it to get confused about what it could and could not reuse |
| 08:11:54 | slava | yo evan |
| 08:12:09 | evan | hi hi |
| 08:12:27 | dbussink | evan: i wonder whether the fix would have any effect on those other issues i saw, but i'll test that right after the fix then :) |
| 08:12:40 | evan | yeah, unknown |
| 08:12:42 | evan | we'll see. |
| 08:36:01 | evan | dbussink: ok, pretty sure i've got it sorted |
| 08:36:07 | evan | but it's at a really low level |
| 08:36:14 | dbussink | evan: w00t :) |
| 08:36:14 | evan | i need to go over it again in the morning before committing it |
| 08:36:26 | dbussink | evan: ah, too bad, would be nice to test with it today a bit |
| 08:36:28 | evan | or I could easily swamp everyones machines |
| 08:37:04 | evan | http://gist.github.com/271089 |
| 08:37:05 | evan | go for it. |
| 08:37:06 | evan | let me know. |
| 08:37:13 | dbussink | ok, cool :) |
| 08:37:31 | evan | nite |
| 08:38:27 | dbussink | nite1 |
| 09:15:39 | dbussink | evan: tested your patch a bit, but it still grows on: https://gist.github.com/50589ee37e77207c9589 |
| 13:23:14 | boyscout | Updated specs for Enumerator#each_with_index. - 6e2d329 - Mikko Perttunen |
| 13:23:14 | boyscout | Fix Enumerator#each_with_index. - c7c8ddf - Mikko Perttunen |
| 13:26:34 | boyscout | CI: rubinius: c7c8ddf successful: 3022 files, 11696 examples, 35896 expectations, 0 failures, 0 errors |
| 13:42:12 | rue | Hm. Interesting results |
| 13:44:56 | rue | dbussink: That is pretty pathological :P |
| 16:54:06 | evan | dbussink: does it stabalize? |
| 16:54:11 | evan | that code you have there was my test case here |
| 16:54:16 | evan | it flattens out |
| 17:15:14 | brixen | morning |
| 17:17:43 | evan | allo |
| 17:34:17 | wayneeseguin | ello! |
| 17:34:24 | evan | morning mr. wayne. |
| 17:36:04 | wayneeseguin | G'marnin evan! |
| 17:36:36 | brixen | wayneeseguin: you hear from monty? I thought you could help him get set up with some scripts to make charts and such |
| 17:36:50 | wayneeseguin | brixen: Monty from MagLev? |
| 17:37:16 | brixen | yeah |
| 17:37:47 | wayneeseguin | He is supposed to call me today about getting MagLev running under rvm :) |
| 17:42:52 | brixen | wayneeseguin: ok cool |
| 17:52:04 | cyndis | do i need to commit new specs to rubyspec + rubinius or is rubinius enough? |
| 17:54:57 | brixen | cyndis_: just commit to rubinius if you are working on rubinius |
| 17:55:08 | cyndis | ok, good |
| 18:35:11 | brixen | I thought 1.9 was going to not dispatch to private methods via #send |
| 18:35:23 | brixen | did I imagine that or did they retract it? |
| 18:35:32 | evan | who the fuck knows. |
| 18:35:37 | brixen | exactly |
| 18:35:38 | brixen | :-/ |
| 18:35:43 | wayneeseguin | I heard that as well however that doesn't mean anything ;) |
| 18:35:45 | evan | they were then going to add a funcall method that would |
| 18:35:47 | evan | or something |
| 18:35:58 | brixen | ok |
| 18:36:16 | brixen | well, in 1.9.2 head, you can still send to private methods |
| 18:36:56 | Zoxc | __send__? |
| 18:37:13 | evan | perhaps they reverted it. |
| 18:37:14 | brixen | this is an issue for the Kernel methods that exist as both "functions" (ie private methods) and module functions on Kernel |
| 18:37:23 | brixen | an issue for the specs rather |
| 18:37:49 | brixen | anyway, I have a method that works |
| 18:37:54 | brixen | I was just curious |
| 18:54:08 | rue | It was retracted. |
| 18:55:17 | brixen | rue: oh, is there a thread on that? |
| 18:58:13 | rue | Think it was discussed on -core, post hoc at least |
| 18:59:40 | rue | But currently and in the forseeable future, the #funcall thing was scuttled |
| 18:59:51 | rue | (And the alternative #send!) |
| 18:59:53 | brixen | it just boggles my mind that path canonicalization for $LOADED_FEATURES was not done till 1.9 |
| 19:00:02 | brixen | and that it wasn't backported to 1.8.7 |
| 19:00:22 | brixen | rue: ok, thanks |
| 19:01:51 | evan | well, this immix bug has exposed a whole failed set of logic. |
| 19:01:58 | evan | now how to fix it... |
| 19:02:14 | brixen | what's the failed logic+ |
| 19:02:14 | brixen | er ? |
| 19:03:32 | rue | If true == false |
| 19:05:46 | evan | ha |
| 19:05:48 | evan | no not that bad. |
| 19:05:54 | evan | there are 2 questions a GC has to answer |
| 19:05:59 | evan | 1) when do I collect? |
| 19:06:04 | evan | 2) when should I expand? |
| 19:06:06 | evan | i guess 3 |
| 19:06:10 | evan | 3) when should I contract? |
| 19:06:50 | evan | our immix GC is flawed because right now the logic looks like |
| 19:06:59 | evan | if just_expanded; collect_soon; end |
| 19:07:06 | evan | anyone see the problem there? |
| 19:08:07 | brixen | just_expanded == allocated more chunks? |
| 19:08:12 | evan | correct. |
| 19:08:20 | brixen | collect_soon == ? |
| 19:08:34 | evan | run the GC at the next safe point |
| 19:08:42 | brixen | will it run right away then? |
| 19:08:46 | evan | no. |
| 19:08:52 | evan | the GC never runs right away |
| 19:08:56 | brixen | but very soon I mean |
| 19:09:02 | evan | very soon, yes. |
| 19:09:26 | brixen | hm |
| 19:09:51 | brixen | but it just expanded, so it's got some space |
| 19:09:56 | brixen | I dunno, what's it doing |
| 19:10:12 | evan | if you're always waiting to collect til right after you expand your bounds |
| 19:10:19 | evan | then you only collect when you don't need to |
| 19:10:28 | evan | and so the memory grows unbounded |
| 19:10:28 | brixen | ok that's what I was thinking |
| 19:10:32 | brixen | gotcha |
| 19:10:44 | evan | because the point of collection is to avoid expansion |
| 19:11:07 | evan | basically, whats happening right now is that the logic is causing immix to expand until it reaches some max size for the set |
| 19:11:17 | evan | and then it's not collecting. |
| 19:11:21 | evan | anyway, it's busted. |
| 19:11:39 | evan | i've got some logic now that does |
| 19:11:43 | brixen | yeah, I see the problem |
| 19:11:50 | evan | if low_on_memory; collect_soon; end |
| 19:12:03 | evan | to try and avoid an expansion |
| 19:12:05 | Defiler | if just_collected && low_on_memry; expand? |
| 19:12:09 | brixen | yeah, seems you need to checks |
| 19:12:12 | evan | but now i'm hitting a pathalogical case |
| 19:12:17 | evan | where it spins collecting |
| 19:12:18 | brixen | one when allocating and one after collection |
| 19:12:25 | evan | and should probably expand |
| 19:12:25 | brixen | s/to/two/ |
| 19:12:38 | brixen | yeah |
| 19:12:49 | evan | Defiler: yeah, i'm adding some extra logic after a collection to see how much space is available |
| 19:12:56 | evan | and there is less than, say, 10% |
| 19:12:58 | evan | i'll expand. |
| 19:13:03 | evan | see what that does. |
| 19:13:53 | brixen | I'm almost full, collect soon; I'm still full, unbuckle the belt one |
| 19:14:26 | evan | heh |
| 19:14:30 | brixen | but what happens if soon doesn't come before it's full to the brim? |
| 19:14:36 | evan | yeah, move to the next notch |
| 19:14:43 | evan | and hope we don't run out of notches! |
| 19:14:46 | brixen | heh |
| 19:15:18 | brixen | so you have a high water mark on collection but is there a OOM that suspends everything and collects immediately? |
| 19:15:23 | brixen | or you just expand in that case? |
| 19:15:39 | brixen | OOM == out of memory "exception" |
| 19:15:53 | brixen | er high water mark on allocation |
| 19:15:54 | brixen | dammit |
| 19:16:38 | evan | no |
| 19:16:54 | evan | there isn't an "OH NO NO MORE MEMORY" condition |
| 19:17:04 | evan | there is just a series of fallbacks |
| 19:17:20 | evan | the last one being going straight to malloc() in the large object array |
| 19:17:21 | evan | area |
| 19:17:23 | evan | if that fails |
| 19:17:27 | evan | then i should probably abort(); |
| 19:17:43 | brixen | ok |
| 19:18:00 | brixen | right, forgot about the LO space |
| 19:18:07 | Zoxc | shouldn't it throw an exception before that? :/ |
| 19:18:17 | evan | to who? |
| 19:18:21 | brixen | heh |
| 19:18:22 | evan | a ruby one? |
| 19:18:25 | Zoxc | yeah |
| 19:18:26 | evan | you're out of memory |
| 19:18:40 | evan | how are you going to come back from that? |
| 19:19:17 | Zoxc | exit propertly, don't do anything, free some memory? |
| 19:19:32 | brixen | abort() is a proper exit, malloc() just failed |
| 19:19:49 | brixen | and you have no more room to run |
| 19:20:16 | Zoxc | abort doesn't sound like a proper exit, it sounds like a forced exit :/ |
| 19:20:45 | evan | i'd argue there is no proper exit on an OOM condition. |
| 19:20:55 | evan | pretty much no program handles it in a proper way. |
| 19:21:03 | evan | MRI just abort()s |
| 19:22:05 | brixen | you could conceivably reserve some memory to try to clean things up, but that could launch you right back into OOM condition |
| 19:22:12 | brixen | abort() is totally reasonable |
| 19:22:49 | brixen | reserve could just postpone OOM actually, not prevent it |
| 19:24:12 | brixen | I think there's a ulrich drepper redhat paper on memory that discusses OOM strategies |
| 19:24:29 | Zoxc | you could end up with a chain of NoMemoryError terminating the application, but atleast it's attemting to terminate propertly |
| 19:25:38 | evan | i'm going to spend my time trying to avoid OOM conditions |
| 19:25:52 | brixen | good plan |
| 19:28:16 | Zoxc | that doesn't work when you're actually out of memory though :/ |
| 19:28:16 | dbussink | evan: i saw you said it stabilized for you, for me it's at almost 900 mb now and still growing |
| 19:28:37 | evan | it's at that now? |
| 19:28:41 | evan | so it's growing slowly? |
| 19:28:42 | dbussink | evan: yeah |
| 19:28:46 | dbussink | growing slowly |
| 19:28:50 | dbussink | with your patch you gisted that is |
| 19:28:54 | evan | ok |
| 19:28:57 | evan | before it was growing very fast |
| 19:29:01 | evan | so perhaps i didn't wait long enough. |
| 19:29:02 | dbussink | yeah |
| 19:29:20 | dbussink | sometimes it looks that it stabilized for like 20 secs |
| 19:29:24 | dbussink | and then starts growing further |
| 19:30:53 | dbussink | evan: 1G now |
| 19:31:00 | evan | kill it |
| 19:31:02 | evan | it's not useful. |
| 19:31:10 | dbussink | hehe |
| 19:31:20 | dbussink | but it still grows then ;) |
| 19:31:26 | evan | le sigh |
| 19:31:28 | evan | i'm working on it! |
| 19:32:31 | dbussink | hehe, np, just read up on the architectural issue it has |
| 19:32:34 | dbussink | which is pretty nasty |
| 19:32:41 | dbussink | to have to rethink something like that |
| 19:33:00 | Defiler | That's the whole fun part about working on a project like this |
| 19:33:02 | evan | i'm open to ideas. |
| 19:33:06 | Defiler | Don't try to take it away from him! :) |
| 19:33:08 | evan | i'm the only one that ever works on this code. |
| 19:33:59 | brixen | :( |
| 19:34:08 | brixen | I'll trade you these fucking require specs |
| 19:34:27 | brixen | I swear, everyone loses their commit bit if I ever see specs like this again |
| 19:34:36 | brixen | but there is light at the end of the tunnel now |
| 19:34:39 | Defiler | It seems to me that '(wired object size before collection - wired object size after collection) / size before collection' is the metric worth caring about |
| 19:34:59 | Defiler | Like.. GC success velocity |
| 19:35:22 | Defiler | and that as that approaches zero, your need to allocate more memory approaches 100% |
| 19:35:23 | brixen | what's a wired object? |
| 19:35:33 | Defiler | reachable object, sorry |
| 19:35:40 | brixen | oh heh |
| 19:35:54 | Defiler | been spending too long in activity monitor |
| 19:36:01 | brixen | heh |
| 19:39:04 | Defiler | So, if you figured that number, and allocated more every time it was less than 0.1.. that seems like it would work |
| 19:40:03 | Defiler | In other words, any time a collection cycle fails to get you at least 10% more free space |
| 19:40:49 | evan | right. |
| 19:42:57 | dbussink | aren't there some papers that investigate this exact problem? |
| 19:43:05 | evan | not that i've found. |
| 19:43:08 | dbussink | or is it something everyone tweaks a bit with for themselves |
| 19:43:17 | evan | they almost all talk about how to collect |
| 19:43:21 | evan | but not when to collect. |
| 19:43:50 | Defiler | if would_be_nice_to_have_more_space_for_what_comes_next then collect... |
| 19:44:30 | evan | if nearly_out_of_space; chillix(i.got_this); end |
| 19:44:36 | evan | if nearly_out_of_space; chillax(i.got_this); end |
| 19:45:39 | Defiler | chillix would be a better GC name though |
| 19:45:50 | evan | hah |
| 19:45:52 | evan | yes, it would. |
| 19:46:36 | evan | i think i'm going to the grilled chese trunk for lunch today |
| 19:46:36 | scoopr | cillitbang |
| 19:46:37 | evan | mmmm. |
| 19:46:54 | BrianRice-work | mmm grilled cheese grill |
| 19:47:19 | evan | what is this crazy-ness you ask? http://thegrilledcheesetruck.com/ |
| 19:47:41 | BrianRice-work | http://www.grilledcheesegrill.com/ |
| 19:48:25 | evan | oh yeah! well our trunk has cheese flames on the side! |
| 19:48:27 | evan | beat that! |
| 19:48:35 | evan | you heard me |
| 19:48:37 | evan | CHEESE FLAMES |
| 19:48:49 | BrianRice-work | heh |
| 19:48:51 | evan | oh man, it's only 5 blocks away. |
| 19:50:15 | evan | ok, added a live_bytes_percentage to post collection |
| 19:50:29 | evan | and expanding when thats greater than 85 |
| 19:50:37 | evan | seems to work |
| 19:52:49 | evan | though i think there is another rubinius memory leak |
| 19:53:07 | evan | because by the end, there was 100M of immix data allocated |
| 19:53:19 | evan | but AM said there was like 300M+ wired |
| 19:53:43 | evan | perhaps thats the VMMethod leak. |
| 19:53:47 | dbussink | evan: that could be what i was seeing then |
| 19:53:50 | evan | which i want to try and fix today. |
| 19:53:55 | evan | probably not |
| 19:54:02 | evan | unless you're creating methods in a loop :) |
| 19:55:01 | dbussink | nope, still the same example :) |
| 19:56:02 | evan | dbussink: 10.6? |
| 19:56:13 | dbussink | evan: yeah, 64 bit |
| 19:56:15 | evan | k |
| 20:01:39 | evan | I should note: http://www.technovelty.org/code/arch/micro-analysis.html |
| 20:01:44 | evan | that is very interesting |
| 20:01:51 | evan | i might have to play with it inside vbox. |
| 20:03:05 | brixen | mm interesting |
| 20:03:13 | evan | it's the other GC time! |
| 20:03:19 | evan | Grilled Cheese! |
| 20:03:45 | evan | my live_cheese_quotant is low! must refill! |
| 20:04:43 | brixen | heh |
| 20:05:03 | brixen | ah there's a link to that drepper paper on this page |
| 20:40:51 | dbussink | evan: do you think we should use ./configure to check for headers that are explicitly needed for building? like readline etc. ? |
| 20:40:57 | wayneeseguin | brixen: I just got off the phone with Monty, I showed him the benchmark report |
| 20:41:03 | wayneeseguin | we're going to get MagLev on it |
| 20:44:01 | brixen | sweet |
| 20:44:22 | brixen | dbussink: yeah |
| 20:46:05 | evan | dbussink: no |
| 20:46:08 | evan | configure should not do that |
| 20:46:12 | evan | the extension itself should |
| 20:46:15 | dbussink | conflicting ideas! |
| 20:46:22 | evan | and it should just not build if what it wants aren't available |
| 20:46:54 | evan | adding cases to ./configure to detect things that the extensions need doesn't scale |
| 20:46:58 | evan | and it's confusing |
| 20:47:15 | dbussink | isn't not building also pretty confusing? |
| 20:47:20 | evan | nah. |
| 20:47:25 | brixen | evan: I thought we discussed adding a flag to configure to ignore missing readline etc |
| 20:47:41 | evan | we talked about what to do |
| 20:47:53 | evan | i recall us saying that an extension should detect and build |
| 20:48:03 | brixen | well, autotool configure uses --with-blah etc |
| 20:48:04 | evan | at any rate, thats the direction i'd prefer we go. |
| 20:48:11 | brixen | I don't see why that doesn't scale |
| 20:48:38 | brixen | anyway whatever works |
| 20:48:49 | brixen | I'm not getting distracted from these specs |
| 20:48:54 | evan | k |
| 20:48:58 | evan | i'm open to either |
| 20:48:59 | brixen | because they are ruining my fucking year |
| 20:48:59 | evan | really |
| 20:49:29 | brixen | I just need to finish them |
| 20:49:31 | brixen | no distractions |
| 20:49:46 | brixen | whatever works with configure, etc, great |
| 20:49:49 | evan | yes please |
| 20:49:55 | brixen | the ext building is still a horrid mess |
| 20:49:56 | brixen | le sight |
| 20:49:59 | brixen | er -t |
| 20:50:00 | brixen | anyway |
| 20:50:05 | brixen | seeks caffeine |
| 22:01:54 | evan | ok, i think this immix code is working fine |
| 22:01:59 | evan | and better than before |
| 22:02:04 | evan | i don't see the pathalogical cases anymore. |
| 22:02:35 | boyscout | Add spec for method_missing + super behavior - 62524d0 - Evan Phoenix |
| 22:02:35 | boyscout | Fix method_missing + super behavior. Fixes #157. - 31ddb88 - Evan Phoenix |
| 22:02:35 | boyscout | Kludge around an immix memory increase boundary case - defd53a - Evan Phoenix |
| 22:06:11 | boyscout | CI: rubinius: defd53a successful: 3022 files, 11697 examples, 35898 expectations, 0 failures, 0 errors |
| 22:12:20 | evan | well thanks good. |
| 22:13:52 | dbussink | evan: looks like stabilized at around 75mb here |
| 22:14:00 | evan | oh good. |
| 22:14:04 | evan | i was hoping you'd say that. |
| 22:14:11 | dbussink | hehe, i can imagine :) |
| 22:18:23 | dbussink | evan: you're were going to check out the next leak? |
| 22:18:33 | evan | yeah, in VMMethod |
| 22:18:35 | evan | i know what it is |
| 22:18:49 | evan | i have to figure out how to rearchitect to get rid of it though. |
| 22:58:39 | cored | hi guys |
| 22:58:44 | cored | evan: are you around |
| 22:58:46 | cored | ? |
| 22:58:53 | evan | yep |
| 23:00:03 | cored | i was reading your article about coerce |
| 23:00:11 | evan | ah, yep. |
| 23:00:48 | cored | http://gist.github.com/271699 |
| 23:00:54 | cored | that was my try to solve the Float part |
| 23:01:22 | cored | is that right ? |
| 23:01:37 | cored | i don't think i understand very well what were you talking about |
| 23:01:38 | evan | does it do what you think it should do? |
| 23:01:51 | cored | kinda |
| 23:01:52 | cored | :-P |
| 23:01:56 | evan | heh |
| 23:02:11 | cored | it's returning 10 |
| 23:02:24 | cored | not 10.0 but it handle the Float |
| 23:02:39 | evan | you coerced the Float to an int |
| 23:02:49 | evan | it coerce other.to_i is called. |
| 23:04:19 | cored | hm, so in that case it can be specific to Float switching the cast to to_f |
| 23:04:32 | cored | but it won't handle the Integer case, unless i put another switch statement |
| 23:06:30 | evan | so put one |
| 23:06:32 | evan | no harm |
| 23:09:26 | cored | ok |
| 23:09:28 | cored | thanks |