| timotimo | i had suspected it in line_coverage.c | 00:00 | |
| wonder if the output files would get trashed by multiple threads running code simultaneously | |||
| i could actually re-use telemetry for this and make coverage logging and telemetry mutually exclusive | 00:03 | ||
| MasterDuke | seems reasonable | 00:04 | |
| timotimo | the data delivery mechanism of telemeh only permits a little bit of data for every "packet" | 00:05 | |
| MasterDuke | enough for filepath + linenum? | 00:07 | |
| timotimo | nope | 00:11 | |
| the biggest is long long + int + const char * | 00:12 | ||
| and also the thread id | |||
| MasterDuke | hm, create some sort of hash of filepaths and just pass keys/indexes? | 00:13 | |
| timotimo | hmm, are the strings in the annotation perhaps null terminated ... | ||
| MasterDuke | afk for a bit | 00:14 | |
| timotimo | hm, if i serialize instrumentation barriers so that i am guaranteed exclusive access to a datastructure to register loc info IDs ... | 00:27 | |
| ooh, /me learns about the quota boost | 00:49 | ||
| jnthn | sleep & | 01:01 | |
| MasterDuke | i feel like there's some joke to be made about upgrading my Perl 6 interpreter with nitrous | 01:04 | |
| timotimo: fyi, `perl6 -e 'my $a; for ^100_000 { $a = $_.comb.sort.unique }; say $a'` took 4s normally, 8s with MVM_COVERAGE_LOG=c0.log and MVM_COVERAGE_CONTROL=2 | 01:11 | ||
| interestingly, when i misspelled .unique as .uniq, with those env variables set i got `MoarVM oops: Spesh: failed to fix up inline 1` instead of `No such method 'uniq' for invocant of type 'Seq'. Did you mean 'unique'? in block <unit> at -e line 1` | 01:13 | ||
|
01:52
ilbot3 joined
04:33
channing1 joined
04:41
channing1 left
06:24
buggable joined
07:50
Geth joined
08:08
Ven joined
|
|||
| Geth | MoarVM: 074145ce5f | (Jan-Olof Hendig)++ | src/io/asyncsocket.c Remove unused variable No longer used after commit 2b0739d8 |
08:10 | |
| MoarVM: 1be02e0363 | (Jan-Olof Hendig)++ | src/core/fixedsizealloc.c Remove another unused variable Possible copy/paste error |
|||
| MoarVM: 715447df4c | niner++ (committed using GitHub Web editor) | 2 files Merge pull request #628 from dogbert17/remove-unused-vars Remove unused vars |
|||
|
09:30
dogbert11 joined
09:58
Ven joined
10:08
AlexDaniel joined
10:42
Ven_ joined
|
|||
| dogbert11 | just tried to build the 'even-moar-jit' branch but the configuration step failed with: | 11:46 | |
| Generating src/gen/config.h ............................ FAIL | |||
| unknown configuration key 'jit_arch' | |||
| what could be the reson for this? | 11:47 | ||
| is it because I'm on 32-bit? | |||
|
11:59
Ven joined
|
|||
| MasterDuke | dogbert11: hm, maybe Configure.pl around line 403 needs another branch in that if statement | 11:59 | |
| dogbert11 | MasterDuke: I was tricked, it did complain with the message 'JIT isn't supported on platforms with 4 byte pointers.'. However this message is hidden in the config output which leads me to wonder why the config process isn't stopped at that point. | 12:31 | |
| MasterDuke | yeah, that's odd | 12:32 | |
| dogbert11 | it just prints the message and continues only to fail completely a short time later with the 'jit_arch' message | 12:33 | |
| MasterDuke | hm, so we lose 32bit support completely with that branch? or is there a way to tell it to not build the jit? | 12:35 | |
| dogbert11 | I don't believe that the jit has ever worked on 32 bit for some unspecified reason | 12:36 | |
| jnthn | I suspect the configure problem is just an accident rather than anything deep | 12:37 | |
| MasterDuke | yeah, but you can build the current moar without it | ||
| jnthn | From the error, it seems like it's trying to find a jit-related bit of configuration and include it in a non-JIT build | ||
|
12:37
http_GK1wmSU joined
|
|||
| jnthn | dogbert11: Reason is that x64 machine code and x86 machine code are quite different things to produce. :) | 12:38 | |
| dogbert11 | ah, simple as that :) | 12:39 | |
| jnthn | And so producing the x86 code as well is a substantial amount of work, though the expr JIT will make it possible to do so with less effort | ||
| MasterDuke | fyi, on a semi-related note, i just built the even-moar-jit branch, built nqp, passed nqp's tests, built rakudo, and then passed its test and spectest | 12:40 | |
| Geth | MoarVM: f3fc2029db | MasterDuke17++ | src/strings/ascii.c Del unused var in MVM_string_ascii_encode_substr The variable was just a cast of an argument and only used once, just cast the argument directly. |
||
| MoarVM: a9c421b1a3 | MasterDuke17++ | src/strings/latin1.c Del unused var in MVM_string_latin1_encode_substr The variable was just a cast of an argument and only used once, just cast the argument directly. |
|||
| MoarVM: cbb1faa1bb | (Jonathan Worthington)++ (committed using GitHub Web editor) | 2 files Merge pull request #619 from MasterDuke17/remove_unnecessary_variable_in_MVM_string__encode_substr Remove unnecessary variable in MVM_string_(ascii|latin1)_encode_substr |
|||
| dogbert11 | should the new jit branch lead to any performance increases? | ||
|
12:40
http_GK1wmSU left
|
|||
| Geth | MoarVM: 123dbdb929 | (David Warring)++ | src/6model/serialization.c attempt at a better error message for RT#126341 |
12:41 | |
| MoarVM: 8752f9b0fe | (Jonathan Worthington)++ (committed using GitHub Web editor) | src/6model/serialization.c Merge pull request #617 from dwarring/rt126341 attempt at a better error message for RT#126341 |
|||
| synopsebot6 | Link: rt.perl.org/rt3/Public/Bug/Display...?id=126341 | ||
| synopsebot6 | Link: rt.perl.org/rt3/Public/Bug/Display...?id=126341 | ||
| MasterDuke | my spectest time was roughly in line with before, but i don't have exact numbers to compare | ||
| dogbert11 | jnthn++ new blog post | 12:42 | |
| could it be said that Perl6 have three different optimizers, i.e. the jit, spesh and the --optimize switch in the perl6 executable? | 12:43 | ||
| timotimo | hm, i suppose so | 12:51 | |
| though the current jit doesn't optimize much | |||
| the new jit is an optimizer compared to the current jit :P | |||
| but will get more stuff as time passes | |||
| dogbert11 | very cool, I guess I'll have to switch to a 64 bit vm sooner or later | 12:52 | |
| timotimo | but yeah, the --optimize flag in the perl6 executable is completely distinct | ||
| i'd recommend that :) | |||
| dogbert11 | how does that work, i.e. what kind of optimizations does it do? | ||
| timotimo | it's written in nqp and operates on the QAST representation of the code | 12:53 | |
| you can get a look at what it does by comparing --target=ast and --target=optimize | |||
| dogbert11 | so that optimizer works on a higher language level than both spesh and the jit? | 12:54 | |
| timotimo | i'd say the most important thing it does is turn lexical variables into local variables because only blocks without lexical variables can be directly inlined into their lexical outers | ||
| that's right, but it also doesn't have any run-time information | |||
| dogbert11 | so it does its job at program startup/parsing? | 12:55 | |
| timotimo | during compilation, yes, including precompilation of modules | ||
| dogbert11 | interesting indeed | 12:56 | |
| timotimo | another thing is that the MAST generated from the QAST is sometimes quite ugly | 12:57 | |
| spesh can help there, too | |||
| like an abundance of decont and hllize instructions that don't actually do anything in 99.9% of code execution | 12:58 | ||
| dogbert11 | hmm, slightly confusing terminology though, ASA, QAST, MAST and CFG's in SSA form | ||
| ASA -> AST | 12:59 | ||
| timotimo | well, QAST is just "what comes after PAST" and PAST was Parrot AST | 13:10 | |
|
13:10
lizmat joined
|
|||
| timotimo | MAST is a moarvm-specific format that's no longer tree-shaped and very close to moarvm bytecode | 13:11 | |
| dogbert11 | thx for the explanation timotimo | 13:23 | |
| timotimo | no prob | 13:25 | |
| i was going to point you at the mastcompiler c file in moarvm and say "that's why this file is so tiny and simple" | 13:26 | ||
| but it's still pretty big :P | |||
|
13:27
AlexDaniel joined
|
|||
| timotimo | moar is doing something strange | 14:03 | |
| opening /proc/self/stat multiple times per second | |||
| checking if it should do a full gc, huh | 14:06 | ||
| can't be too slow i suppose; it doesn't show up notably in the perf output | 14:07 | ||
|
15:12
zakharyas joined
|
|||
| AlexDaniel | MasterDuke: hey, so what's the current status of the leak? | 15:42 | |
|
15:45
pharv joined
|
|||
| timotimo | hm, so, heaptrack, right? can we get it to show more than just the caller of the allocator function itself? | 15:46 | |
|
16:08
Ven joined
|
|||
| MasterDuke | timotimo: would the flame graph be more useful? i.imgur.com/dJXfLVF.png | 16:51 | |
| timotimo | yeah that looks interesting | 16:52 | |
| does "allocations" mean "how often was any allocator function called"? | |||
| is there one that tallies up the size? | 16:53 | ||
| MasterDuke | i.imgur.com/MobPJRy.png | ||
| timotimo | ah dang | ||
| MasterDuke | ? | 16:54 | |
| timotimo | whatever function ends up triggering the gc will get the nursery re-allocation counted towards it | ||
|
16:54
Ven_ joined
|
|||
| timotimo | that won't do at all | 16:55 | |
| however, we do see that the "little" buffers we allocate for libuv to fill make up a big chunk of what we allocate in total | |||
| MasterDuke | i.imgur.com/J20JZv5.png by peak allocation | 16:56 | |
| do you have heaptrack installed? | |||
| timotimo | i do | 16:58 | |
| i think? | |||
| hm, okay, the peak of stuff allocated there isn't terribly bad | |||
| MasterDuke | i could put my heaptrack recording on the whateverable server if you want to play around with viewing it locally | 16:59 | |
| timotimo | interesting | 17:03 | |
| hm but now | |||
| this is leaking, right? | |||
| i.e. increasing its memory | |||
| MasterDuke | yeah | 17:04 | |
| timotimo | does any part of the flame graph get noticably bigger or does it all just sort of grow together? | ||
| MasterDuke | i.imgur.com/CnqmYw8.png | ||
| timotimo: don't quite understand the question | 17:08 | ||
| timotimo | like do all parts grow equally when you increase the number of iterations? | 17:16 | |
|
17:29
Voldenet joined
|
|||
| timotimo | can you hide individual slices from that mountain graph? | 17:35 | |
| everything above the orange is really difficult to make out because it just goes up and down so much | 17:36 | ||
| MasterDuke | you can zoom in and hover over the sections and it'll tell you the function they're for. hard to show that in a screenshot though | 17:43 | |
| timotimo | right | ||
| might have to actually use the heap snapshot profile for this task | |||
| MasterDuke | but it was causing immediate segvs | 17:44 | |
| timotimo | wow, damn | 17:45 | |
| MasterDuke | fyi, i just put the heaptrack recording on the whateverable server | ||
| if you want it | |||
| timotimo | interesting, it segfaults inside spesh | 17:46 | |
| without spesh the heap profiler can run | |||
| jnthn | Huh, that's a bit odd... | ||
| timotimo | when gc-ing sim frames | 17:47 | |
| MasterDuke | maybe related, but did you notice my comments from late last night ? | ||
| interestingly, when i misspelled .unique as .uniq, with those env variables set i got `MoarVM oops: Spesh: failed to fix up inline 1` instead of `No such method 'uniq' for invocant of type 'Seq'. Did you mean 'unique'? in block <unit> at -e line 1` | |||
| timotimo | i only looked at it a microscopical bit | ||
| so don't know what actually is broken here | |||
| jnthn | The spesh worker thread runs just as a normal thread, so... | ||
| MasterDuke: Can you file that as a MoarVM issue? I'd like to look at that during the week. | |||
| MasterDuke | jnthn: the heap profiler thing? or the "failed to fix up inline"? | 17:48 | |
| jnthn | MasterDuke: The inline one | 17:49 | |
| MasterDuke | k | ||
| jnthn | I changed a bunch of inline-related things last week so we can actually deleted dead inlines. | ||
| *delete | |||
| It should mark what it removes | |||
| And then not try to fix them up | |||
| And I remembering writing the code to make it handle nested inlines | 17:50 | ||
| So not sure what'd be going on. Will look in the next days. | |||
| MasterDuke | github.com/MoarVM/MoarVM/issues/629 | 17:52 | |
| jnthn | Thanks! | ||
| jnthn figures he should try and rest some ahead of throwing himself into another week of MoarVM hackery :) | 17:53 | ||
| MasterDuke | also, jnthn++ for spesh blog post. very understandable | 17:54 | |
| jnthn | Glad it made some sense; always have to be careful writing such things after having been dug into the problem space for weeks :) | 17:59 | |
| dogbert11 | MasterDuke: I believe I misunderstood your memory problems yesterday, the problem is not memory leaks but rather memory usage. Is that correct? | 18:07 | |
|
18:08
lizmat joined
|
|||
| MasterDuke | i'd say both | 18:09 | |
| dogbert11 | running your gist from yesterday (with four iterations rather than 20), leaks are negligible but allocated memory is soething else ... | 18:10 | |
| MoarVM version 2017.07-333-g8752f9b0: total heap usage: 748,062 allocs, 433,024 frees, 1,337,211,640 bytes allocated | 18:11 | ||
| MoarVM version 2017.07: total heap usage: 643,447 allocs, 374,708 frees, 417,122,198 bytes allocated | 18:12 | ||
| MasterDuke | yeah, i think there's some of both, but the large allocations is more noticeable | ||
| hm, wonder if i should do some manual bisecting with valgrind on the whateverable server | 18:14 | ||
| AlexDaniel | bisecting bisectable again? :) | 18:23 | |
| MasterDuke | turtles all the way down! | 18:25 | |
| dogbert11 | hmm, the gisted code breaks --profile | 18:28 | |
| dogbert11 tries another program | 18:30 | ||
| japhb | .oO( "Bisecting the bisectables but they don't know / Debugging the buggables but in the end you know / You turn away, what can I say?" ) |
||
| MasterDuke | dogbert11: yeah, pretty much anything with run/Proc::Async/etc breaks profiling | 18:31 | |
|
18:39
Ven joined
19:06
Voldenet_ joined
19:11
leego joined
|
|||
| MasterDuke | looks like it's github.com/rakudo/rakudo/commit/0564891 | 19:13 | |
| valgrind says 2,037,358,560 bytes allocated after that commit, 378,997,214 bytes allocated before that commit | 19:15 | ||
| for 5 iterations in my test script | |||
|
19:18
ggoebel joined,
timotimo joined,
tbrowder joined
|
|||
| AlexDaniel | :o | 19:24 | |
|
19:47
brrt joined
|
|||
| brrt | .tell jnthn: yeah, i need to rethink how i do the jit-compiler-disabling | 19:49 | |
| yoleaux | brrt: What kind of a name is "jnthn:"?! | ||
| brrt | .tell jnthn i need to rethink how to disable the jt compiler at build time, now that it is so much larger than before | ||
| yoleaux | brrt: I'll pass your message to jnthn. | ||
| dogbert11 | MasterDuke++ | 19:51 | |
| brrt: irclog.perlgeek.de/moarvm/2017-08-06#i_14974983 | |||
| brrt | i saw it. travis ci also saw it. | ||
| :-) | |||
| dogbert11 | yay | 19:52 | |
| brrt | root issue: we're trying to compile a bunch of stuff that doesn't need to be compiled | ||
| i'm wondering how i can make it not do that | 19:53 | ||
| well, i know a way.. | |||
| dogbert11 | sounds promising | ||
| brrt | it sounds like it would be a hack; i could wrap the entire thing with an ifdef | 19:54 | |
| which would work, but i'd rather not | |||
| has to be a better way | 19:55 | ||
| anyway, i'm off again :-) | |||
|
20:32
zakharyas joined
|
|||
| MasterDuke | looks like it's github.com/MoarVM/MoarVM/commit/5c...46eb9b9058 | 20:47 | |
| timotimo | but that should only cause churn, i.e. things being malloced and soon freed again | 20:48 | |
| MasterDuke | well this is just based on valgrind's "total heap usage" line | 20:51 | |
| the last "allocated" number | |||
| before that commit it's ~300,00,00, after it's ~2,000,000,000 | |||
| timotimo | that's "total allocated" but not "in use at end" right? | 20:52 | |
| MasterDuke | right, that's number is pretty much the same | 20:53 | |
| timotimo | yeah, so it's just useless information :) | ||
| MasterDuke | hm. what would be more useful? | 20:55 | |
| timotimo | hm | ||
| figuring out what kind of object there is more of after each iteration | |||
| but if you want you can probably revert that commit to get a less inflated number there | 20:56 | ||
| MasterDuke | think it'll revert cleanly? | ||
| how would i get a count of objects if i can't use the heap profiler? | 20:59 | ||
| timotimo | does it also crash if you turn spesh off? | 21:01 | |
| MasterDuke | not immediately... | 21:03 | |
| ah, got a snapshot with spesh disabled | 21:08 | ||
| let see, guess i should get one at 2017.07 to compare | 21:09 | ||
| ugh, 2017.07 gave `MoarVM panic: Memory allocation failed; could not allocate 72085436 bytes` | 21:13 | ||
| MasterDuke needs moar ram! | |||
|
21:16
ilmari[m] joined
21:20
zakharyas joined
|
|||
| MasterDuke | had to reduce the number of iterations in my script to 3 | 21:29 | |
| but now i have a heap profile, with 43 snapshots | 21:30 | ||
| which one(s) should i look at? | |||
| timotimo | oof | 21:36 | |
| we don't really have a way to cross-reference what happens in the program with the heap snapshots, except for looking really closely | 21:37 | ||
| one of the reasons i'd like to offer an op that lets you put a piece of data into telemeh | |||
| MasterDuke | would one at random in the middle be somewhat representative? | 21:40 | |
| timotimo | i suppose, but i'd rather go near the end | ||
| MasterDuke | hm, 43 snapshots at 2017.07, only 34 at head | 21:41 | |
| timotimo | mhm | 21:42 | |
| i forgot what exactly it was that jnthn did to often cause us fewer gc runs | |||
| MasterDuke | compare 3/4ths of the way through of each? | ||
| timotimo | mhm | ||
| MasterDuke | say #35 and #28? | ||
| ugh, and don't have to ram to open both at once... | 21:43 | ||
| timotimo | oops :( | 21:44 | |
| on my laptop i have as much zram as i have actual ram | |||
| ever since i destroyed the slotted-in ram (or whatever else) i'm suffering under low ram all the time | |||
| MasterDuke | i don't have a swap be default | ||
| timotimo | oh | ||
| i have 2x zram compared to normal ram | |||
| it's actually already as full as the ram totally (i.e. including the compressed parts) | |||
| MasterDuke | top objects by size? anything else useful? | 21:46 | |
| MasterDuke doesn't have enough ram to have two heap analyzers open on any one computer, but just realized he's using two computers... | 21:49 | ||
| timotimo | maybe also top objects by count and top stables by size and count | 21:53 | |
| and maybe even top frames by size | |||
| MasterDuke | 2017.07 gist.github.com/MasterDuke17/2cad4...96688f031f | 21:55 | |
| HEAD gist.github.com/MasterDuke17/f0220...6a8948cc42 | 21:57 | ||
|
21:59
pharv joined
|
|||
| timotimo | that's a whole lotta buf | 22:00 | |
| MasterDuke | but more at 2017.07 than HEAD | 22:04 | |
| timotimo | huh | 22:05 | |
|
22:13
Voldenet joined
22:53
MasterDuke joined
23:03
Ven joined
23:19
pharv joined
|
|||
| MasterDuke | jnthn: does any of the the above point anything out to you? something else timotimo and/or i should try? | 23:24 | |
| jnthn | MasterDuke: Not really; I'll see if I can figure it out a bit more tomorrow though. | ||
| Heading to sleep shortly | |||
| MasterDuke | cool, later... | 23:26 | |
| timotimo | i feel like sleep, too | 23:31 | |
| have you tried the realloc trick for the bufs that we allocate for libuv btw? | |||
| MasterDuke | no, didn't figure out what exactly was getting realloced to what value | 23:34 | |
| but can try if you can give some more detailed instructions | |||
| timotimo | oh, sure | 23:36 | |
| what file was that in again ... | |||
| MasterDuke | procops.c, somewhere around line 531 i believe | ||
| timotimo | right, so buf->base is the pointer that's eligible for reallocing, buf->len is the actual size that it was last allocated with, and nread is how much is actually used inside the buffer | 23:38 | |
| since we don't expect the buffer to be changed afterwards, we can probably just realloc it to the exact number of items read | |||
| MasterDuke | jnthn had some comment about how buf->len is supposed to be correct (or something like that) | ||
| timotimo | if we decide to, for example, round up to the next number aligned to, like, 32 bytes, or whatever, we'd have a different ssize vs elems | 23:39 | |
| MasterDuke | irclog.perlgeek.de/moarvm/2017-08-05#i_14973403 | 23:40 | |
| so i shouldn't just change what res_buf->body.ssize gets assigned, i need to do a realloc? | 23:41 | ||
| timotimo | ssize will hold what you realloc to, which may be different from the number of elements used | 23:42 | |
| MasterDuke | so realloc, then set ssize to whatever value i used for the realloc? | 23:43 | |
| btw, i assume the new value should be nread*(sizeof an element), but what is that size? | 23:44 | ||
| oh, tc->instance->str_consts.buf_type perhaps? | 23:47 | ||
| timotimo | no, that's all just strings | ||
| we use 8 bits for all of these | 23:48 | ||
| that's also why the .i8 slot is selected for assignment | 23:49 | ||
| (even though it makes no difference) | |||
| (all platforms we develop for have the same size of pointer for all kinds of things pointed at) | |||
| MasterDuke | ah, so just nread*1 ? | ||
| timotimo | i believe so | 23:52 | |
| MasterDuke | `error: assignment of member ‘base’ in read-only object` | 23:55 | |
| 1519408maxresident)k before, 1303076maxresident)k after | 23:59 | ||
| timotimo | um, huh? | ||
| MasterDuke | res_buf->body.slots.i8 = MVM_realloc(buf->base, nread); res_buf->body.ssize = nread; | ||
| timotimo | oh, huh | ||