Welcome to the main channel on the development of MoarVM, a virtual machine for NQP and Rakudo (moarvm.org). This channel is being logged for historical purposes.
Set by lizmat on 24 May 2021.
00:02 reportable6 left 00:04 reportable6 joined 00:05 linkable6 joined 00:13 discord-raku-bot left 00:14 discord-raku-bot joined, discord-raku-bot left 00:15 discord-raku-bot left 00:16 discord-raku-bot joined
jdv wuts up with yall and coffee? 01:04
dr told me to cut back but i only do 1 a day so...no?
reaching 01:05
timo i don't drink coffee, i guess i'm one of relatively few computer-workers who don't? 01:13
leont doesn't drink coffee either 01:14
[Coke] I do 2 or 3 caff's a day. 01:30
01:56 linkable6 left, evalable6 left 01:57 evalable6 joined 02:14 ggoebel left 04:08 frost joined 04:31 ggoebel joined 04:56 linkable6 joined 06:00 notable6 left, evalable6 left, bloatable6 left, linkable6 left, bisectable6 left, releasable6 left, coverable6 left, sourceable6 left, reportable6 left, statisfiable6 left, shareable6 left, nativecallable6 left, squashable6 left, unicodable6 left, benchable6 left, greppable6 left, committable6 left, quotable6 left, tellable6 left 06:01 releasable6 joined, notable6 joined, nativecallable6 joined, unicodable6 joined, shareable6 joined 06:02 sourceable6 joined 06:03 squashable6 joined, benchable6 joined
Nicholas jdv: jnthnwrthngtn likes coffee. But sometimes his coffee machine doesn't like him. And sometimes I (also) have daft problems making coffee 06:28
07:01 tellable6 joined, linkable6 joined, committable6 joined
Nicholas good Universal Beverage Time, #moarvm 07:02
nine sticks to the traditional coffee 07:03
07:03 bisectable6 joined
Nicholas to be honest, right now I have regular coffee too 07:03
not some compromise-by-committee "brown liquid served with whipped cream and a straw" which was sort of what I was envisaging 07:04
(no, this is not me being infested with Vienese perverted ideas about what "cappochino" should mean, but more I started with "coke float" and then realised that ice cream wasn't likely to be univeral enough, but whipped cream seemed to be closer)
(I can't spell. This is not news) 07:05
nine I did enjoy tee in the morning as well when I was at Liz and Wendy's but when my wife's first words in the morning are "I'd like coffee" there's just not much I can do :) 07:07
07:22 Altai-man joined 07:23 samcv joined 07:24 [Coke]_ joined 07:31 bartolin_ joined, TempIRCLogger left, RakuIRCLogger left, [Coke] left, sena_kun left, bartolin left, jnthnwrthngtn left 07:48 sena_kun joined 07:50 Altai-man left 07:53 TempIRCLogger joined
lizmat so the good news is: getting back in the morning, my local dev version of the log server *did* start up correctly, reading all the available logs and growing to about 5G in memory 07:55
no idea as to how long it too to get there, but my feeling is about an hour :-(
nine That sounds rather excessive 07:56
07:56 moon-child is now known as Mondenkind
lizmat oddly enough, it appears to take *more* memory than pre-newdisp 07:58
yeah... I was used to ~1.5 mins
actually, it feels like an old bug that was fixed
so I'm thinking: maybe it got lost in the merge 07:59
08:01 quotable6 joined
lizmat anyways, it feels like it is blocking on start { } once the maximum number of threads has been reached 08:02
08:03 greppable6 joined, statisfiable6 joined
lizmat anyways, github.com/rakudo/rakudo/commit/39...6b16e211aa comes to mind 08:03
08:03 evalable6 joined
lizmat ah, also of note: control-c is also safe: once it is loading like that, control-c does *not* get served (or at least not while I was waiting for a few minutes) 08:08
08:18 tbrowder left, tbrowder joined
lizmat running with RAKUDO_SCHEDULER_DEBUG=1 gives a *lot* of "[SCHEDULER 3248] Will not add extra worker; hit 64 thread limit [branch with 0 total completed]" messages 08:19
I guess one for each start block :)
08:27 evalable6 left, statisfiable6 left, greppable6 left, quotable6 left, TempIRCLogger left 08:33 evalable6 joined, statisfiable6 joined, greppable6 joined, quotable6 joined
lizmat ok, the plot thickens: looking at the start of the SCHEDULER debug output 08:48
it looks like it gets into "Heuristic low utilization deadlock situation detected", then adds a worker thread, repeat until no more worker threads possible 08:49
08:50 jnthnwrthngtn joined
lizmat jnthnwrthngtn: not sure if you can backlog 08:50
ok, the plot thickens: looking at the start of the SCHEDULER debug output 08:51
it looks like it gets into "Heuristic low utilization deadlock situation detected", then adds a worker thread, repeat until no more worker threads possible
09:59 psydroid left, AlexDaniel left 10:02 coverable6 joined, AlexDaniel joined 10:07 squashable6 left 10:10 squashable6 joined 10:11 psydroid joined 10:28 Altai-man joined
Nicholas this logger stayed on the same side of the split as lizmat: colabti.org/irclogger/irclogger_lo...2021-10-13 10:32
lizmat yeah... need to make a merger of the different log versions :-) 10:33
ok, I give up on this: I can see all threads being used and executing stuff... it looks like they're waiting for each other on a lower level than I can see 10:48
note that all of these threads *are* executing the same code, but on different files 10:49
*log files
note that at this stage, I will not be able to run the log server in production on new-disp :-( 10:50
11:02 reportable6 joined 11:03 bloatable6 joined
lizmat ok, one final datapoint: loading the log files of a channel with :1degree, is not markably slower than with :15degree 11:09
which leads me to believe that affectively there is only one thread executing the log loading logic at a time
*effectively 11:10
11:16 Xliff joined
lizmat one more final datapoint: 11:31
I've just timed the loading of the channel logs *without* starting the server
if I run with :1degree, I see 31 Threads for the process in MacOS's Process Monitor 11:32
with :15degree, I see 71 threads in the Process Monitor 11:33
Altai-man this sounds like a new blocker?
lizmat however, there is *no* difference in wallclock time, but the :15degree case does take 2 more CPU seconds
Altai-man: yes, I would say this is a blocker, as it would affect any server code, specifically Cro 11:34
Altai-man lizmat, can you please create a new ticket?
lizmat will do
should I do that in MoarVM or Rakudo ? 11:35
feels like a MoarVM issue, but then it could also be a dispatch issue
Altai-man lizmat, rakudo one 11:36
11:51 lizmat_ joined, TempIRCLogger joined 11:52 squashable6 left, RakuIRCLogger joined 11:54 lizmat left 11:55 squashable6 joined 11:57 lizmat_ left, lizmat joined
lizmat github.com/rakudo/rakudo/issues/4569 11:57
jnthnwrthngtn nine ^^
12:02 reportable6 left
jnthnwrthngtn moarning o/ 12:08
Altai-man lizmat++ 12:09
jnthnwrthngtn, morning!
12:10 ggoebel left
jnthnwrthngtn lizmat: Curiously, I did benchmark Cro prior to new-disp merge and saw an *improvement* relative to master 12:11
lizmat: Please add repro instructions to the issue 12:12
I guess I need 1) to know what to install, 2) which command to run, 3) enough data to run it with presumably 12:13
Sigh, I'm hungry.
lizmat: I don't suppose you've been able to repro some simpler .hyper/.race failing to parallelize? 12:14
$ time raku -e '^10 .map({ my $x = 0; for ^10_000_000 { $x++ } })' 12:23
real 0m3,931s
$ time raku -e '^10 .race(:1batch, :10degree).map({ my $x = 0; for ^10_000_000 { $x++ } })'
real 0m0,798s
Sadly, nothing this simple cuts it 12:24
12:32 frost left
lizmat jnthnwrthngtn: maybe IO needs to be involved? 12:54
anyways, releasing the module now, so should be able to just zef install it
and symlink to another dir for the logs
jnthnwrthngtn Thanks 13:00
13:03 reportable6 joined 13:37 [Coke]_ is now known as [Coke]
[Coke] starts on his second cup of coffee 13:44
lizmat jnthnwrthngtn: github.com/rakudo/rakudo/issues/45...-942324062 13:45
13:59 ggoebel joined
[Coke] had a run() that I was then doing a .decode('utf8-c8') on the output of. Using Proc::Async, I want to use "whenever $proc.stdout.lines" - (from doc examples) - is there a similar need to manually decode? 14:05
jnthnwrthngtn Diky, will make a cup of tea and take a look :) 14:16
[Coke]: Pass env => 'utf8-c8' :) 14:17
enc, not env :
argh, 4 hours sleep was not enough 14:18
[Coke] ah, sweet.
14:31 ggoebel left
jnthnwrthngtn lizmat: First attempt: it said "Could not find App::Raku::Log:ver<0.0.1>:auth<zef:lizmat>". Turns out that the script in bin/ asks for 0.0.1, but the version in META6.json is 0.0.3. Tweaking the script gets me further but... 14:32
ailed to get the directory contents of '/home/jnthn/dev/IRC-logs/base/descriptions': Failed to open dir: No such file or directory
(I ran it standing in the clone of IRC-logs, and indeed on't see the base directory
lizmat are you in the App-Raku-Log dir ? 14:33
from the clone?
you should be in the App-Raku-Log clone dir, not in rthe IRC-logs dir 14:34
that should be a subdir of the App-Raku-Log dir now 14:35
Altai-man "Invocant of method 'raku' must be an object instance of type 'Mu', not a type object of type 'Any'. Did you forget a '.new'?" <- is this me or it is very bizarre? I see the exception when printing a value on new-disp, but not on release. The fun thing is that it _does_ print the value properly, but after that throws an error. 14:36
jnthnwrthngtn lizmat: Ah, I see 14:40
Intersting, on my machine it runs for longer with --degree=8 14:43
And maxes out at 134% CPU, and more sys time also
lizmat well, if you have 8+8 cores... it should max out at about 1500% (used to for me before new-disp) 14:44
14:45 ggoebel joined
jnthnwrthngtn #2 0x00007ffff7a4b1cd in uv_mutex_lock () from //home/jnthn/dev/MoarVM/install/lib/libmoar.so 14:46
#3 0x00007ffff78d6a9d in MVM_callsite_intern ()
from //home/jnthn/dev/MoarVM/install/lib/libmoar.so
Loads of threads there
lizmat by default it runs to 71 CPU threads for me 14:47
(that would be with --degree=15 and --batch=16
jnthnwrthngtn $ cat fpic | grep 'Full polymorphic flattening' | wc -l 14:51
lizmat is that good or bad ? 14:55
jnthnwrthngtn Bad that it happens, good in that it's debugging progress 14:58
15:00 ggoebel left
jnthnwrthngtn lizmat: Did this get slower even with --degree=1 ? 15:00
lizmat you mean, compared --degree=15 ? 15:01
jnthnwrthngtn No, I mean --degree=1 after new-disp vs before
(If you don't know, don't worry, if you do it's interesting) 15:02
lizmat I never played with that before new-disp.. I wanted it as fast as possible, so always used the default of --degree=15
m: say Kernel.cpu-cores 15:03
camelia 4
jnthnwrthngtn Fair enough
lizmat actually, that value
(which is 16 for me)
jnthnwrthngtn Well, we end up with 15,548 different callsites getting interned 15:04
m: say 138799 / 15548 15:05
camelia 8.927129
jnthnwrthngtn Yowser.
Are you constructing objects with huge numbers of args?
named args, to be precise
lizmat don't think so? lemme check 15:06
jnthnwrthngtn Ah, I think you probably are. The hierarchy under IRC::Log::Entry 15:07
lizmat with huge number you mean more 10 ?
TWEAK there takes 4 named
could it be that they are named native int parameters ? 15:08
jnthnwrthngtn haha
Let me check something to be sure...
lizmat oki
jnthnwrthngtn hah, yes 15:10
time raku-logs-server --channels=raku-dev --degree=1 --dontstart 15:11
Normally: real0m17,572s
But if you disable hash randomization
Now, can anybody guess what's going on? :)
lizmat hmmm... excessive hashing ? 15:12
jnthnwrthngtn Prior to new-disp, we could never specialize anything when you called it and flattened args. In new-disp we lift that limitation. So in theory, maybe we get to run faster. 15:13
Doing that means that we need to intern the flattened callsites.
It's possible to write a ridiculous program that causes pain, but this should not be one...
...except it is, because when we flatten in a hash, we iterate the hash. 15:14
lizmat yes... we do... :-)
jnthnwrthngtn And that means we iterate it in many orders
(thanks to randomization)
lizmat so maybe hashes are not the right thing for that ? 15:15
jnthnwrthngtn Meaning that we produce many possible permutations of callsite (since those have to commit to an order)
I think we "just" need to iterate them in a stable order
I mean, flattening hash arguments is something we do all over
lizmat yeah, but unless you refer to %_ explicitely, that's all under the hood, no ? 15:16
jnthnwrthngtn Well, the case here is that BUILDALL slurps up the args, and then calls the appropriate BUILD/TWEAK with them flattened 15:18
Nicholas: If one wants a more consistent order when iterating a hash, what is the right thing to do? 15:19
Nicholas "Doctor doctor, it hurts when I do this." "Well, don't do that then". 15:20
Um, I don't see a good answer to this, other than sort the keys
jnthnwrthngtn Yeah, I feared that would be the answer
Nicholas however, sort them on address
not values
just sort the pointers
jnthnwrthngtn ?
Nicholas well, OK
jnthnwrthngtn I suspect we don't intern strings hard enough
Nicholas will different hashes arrive with the same keys? (but different copies of the values)
acutally, if the answer is "different copies of the same value" then IIRC the 64 bit hash value is the same for the same string value (in a given interpreter run) 15:21
jnthnwrthngtn Different copies of the values, but in this case I suspect deserialized from JSON, so the strings will be all over the place
Nicholas so likely sort *those* first, and then tie break on actual string vlaue
jnthnwrthngtn Hash values of strings can be trusted?
Uh, that's a bad question 15:22
Nicholas they have to be determimistic (for a given interpreter run) else how do you find the key in the hash? :-)
lizmat jnthnwrthngtn: actually, no deserializtion from JSON, but from colabti tyle log files
jnthnwrthngtn Hash values of strings are independent of any given hsah?
lizmat *style
jnthnwrthngtn Nicholas: Duh, good point :)
lizmat but indeed.. with strings all over the place
jnthnwrthngtn Not the smartest bear today...
Nicholas hash value will be a function of 1) hash algorithm (ie siphash, until we change that) 2) the 64 bit per-process salt for all hashing 3) the codepoints of the string 15:23
lizmat basically a lot of substr on the log file
jnthnwrthngtn OK, and for a given execution of the VM, 1 and 2 are constant, so it's only 3
Nicholas so, possibly even just sort on 64 bit hash value and if two happen to collide, then, oh well, that's two variants of the same thing interned
or do the job properly...
jnthnwrthngtn Yeah, it'll be more expensive to take care of the collisions than it will be have the dupe interns 15:24
Nicholas but IIRC when hacking on this stuff last year, my code was buggy and I *forgot* to check the actual strings
and we passsed all spectests
jnthnwrthngtn 64 bits is enough for anybody
Nicholas ie our 64 bit hash values are good enough that we "rarely" generate collisions
jnthnwrthngtn Ah, and: I also see a speedup with --degree=8 over --degree=1 with hash randomization disabled 15:26
OK, another cup of tea and I'll try to implement this 15:28
lizmat waits in great anticipation :-) 15:29
Nicholas if thses are MVMString objects found as keys in a hash, then their s->body.cached_hash_code will always be valid and computed already
hence the interface in MVM_string_compute_hash_code() might be a bit less than optima 15:30
and "just cheating and breaking encapsulation inside the function passed to qsort()" might be the best plan
nine If the hashing algorithm is any good, I'd be surprised to see a collision of those 64 bits just about ever 15:35
15:57 dogbert17 left
jnthnwrthngtn Nicholas: Turns out if I used qsort from the C standard library I can't reach the tc anyway, so I just grabbed the cached hash value out :) 16:00
Ah, that's what you realized too and I missed it
The change helps, currently running spectest 16:01
16:06 dogbert17 joined
lizmat jnthnwrthngtn: all of this doesn't make me understand why the performance between --degree=15 and --degree=1 are so similar 16:06
whereas before new-disp they weren't ? 16:07
jnthnwrthngtn lizmat: Hash randomization caused a huge blow-up in the number of possible callsite shapes. With new-disp we now try to intern those so we can use them as specialization keys. 16:11
The first step to seeing if we already have that callsite is a search of all those with the same arity to see if any match.
So the more you have, the longer that search gets 16:12
lizmat I get that... and I guess that search has a lock on it?
jnthnwrthngtn The variation has a second effect: it means that we don't detect the possibility to use an individual dispatch program.
And so we end up slow-pathing those (re-recording them every time) 16:13
Which forces an intern even if the one for flattening is an "if you can"
lizmat I all understand that... but wouldn't that just mean using *more* CPU
jnthnwrthngtn And...you guessed it, the intern cache has a lock on it
lizmat right, ok
that explains 16:14
jnthnwrthngtn That explains the huge increase in system time too
(All the lock acquisitions)
lizmat feels to me that using a lock for this wouldn't scale very well in the further future? 16:15
jnthnwrthngtn What we could do on top of the fix I've already done is move the lookup in the intern cache out of the lock section
lizmat I mean if the lookup could be done lockless :-)
jnthnwrthngtn It can but then you have to repeat it after you acquire the lock.
Well, or some further mitigation of that race
s/further/alternative/ 16:16
lizmat some use of cas ?
jnthnwrthngtn Well, you could use an atomic integer that you read before looking, and then if it's the same after you acquire the lock you know the cache didn't change under you
That's probably the way to go 16:17
Geth MoarVM: e66404a859 | (Jonathan Worthington)++ | src/core/args.c
Ensure stable order of flattened named args

Hash randomization means that the iteration of hash keys varies from hash to hash. In the context of a flattened hash of arguments, this means that a given set of named arguments could appear in many orders upon iteration. Previously, we built up the callsite arg names list in whatever order we got from hash iteration. That means we're liable to ... (6 more lines)
lizmat tries 16:23
jnthnwrthngtn Yeah, over the execution of that program, even with the fix, it looks up 191,986 callsites, but only adds 2160 new ones 16:28
m: say 191986 - 2160 16:29
camelia 189826
jnthnwrthngtn That's quite a lot of saved lock acquisitions
lizmat yup...
preliminary tests: degree=1 goes from 28.15 to 3.43 16:30
preliminary tests: degree=15 goes from 30.39 to 1.785
lizmat is a lot happier camper 16:31
lizmat attempts a full load
yup, eating CPU like crazy now :-) 16:32
jnthnwrthngtn nom nom nom
lizmat less than a minute now to load all of the logs :-)
clocking in at about 5G memory :-) 16:33
16:36 ggoebel joined 16:37 [Coke]_ joined 16:39 [Coke] left
lizmat perhaps time to do a MoarVM bump? 16:42
Altai-man we can 16:43
jnthnwrthngtn I've got another patch spectesting now for reducing locking on the intern cache 16:47
16:48 ggoebel left, ggoebel joined
Geth MoarVM: f7d6bc6149 | (Jonathan Worthington)++ | 2 files
Avoid locking on intern cache lookup

We only really need to take the lock in order to serialize additions. Rather than always searching again to see if the callsite was added, use a total count of interns as a cheaper validation that nothing changed between our search and the lock acquisition.
Altai-man jnthnwrthngtn, want another one before taking a good rest?
jnthnwrthngtn Altai-man: Hm, maybe...what is it?
Altai-man jnthnwrthngtn, "Invocant of method 'raku' must be an object instance of type 'Mu', not a type object of type 'Any'" which started to happen on new-disp. Alas, there is no nice golf as the module does funky things with MOP. Want steps to reproduce? 16:55
jnthnwrthngtn Um...no, I'd prefer a golf, tbh. 16:58
Altai-man aha, I'll try to make one then 16:59
jnthnwrthngtn What kind of bug is it, though? Spesh-sensitive?
Or still there under MVM_SPESH_DISABLE=1?
Altai-man still there when spesh is disabled 17:00
any other flags I should try?
jnthnwrthngtn No, if it's still there when spesh is disabled then that's already ruled out all of spesh :) 17:01
That will probably make it much easier to golf
Altai-man well, the bug is in cro-ldap, tests explode in the parser and it relies on the meta generator, so all of this is a bit entangled. 17:04
jnthnwrthngtn This is a recent regression, given we didn't see it in blin before? 17:06
17:06 [Coke]_ is now known as [Coke]
Altai-man the module is not in the ecosystem, so not something recent, alas 17:06
oh no, github.com/rakudo/rakudo/issues/4570
jnthnwrthngtn, I'll try to golf it down, anyway 17:07
jnthnwrthngtn Yeah, I'd appreciate others doing golfing. I've done so much of it over the last weeks/months.
I don't think that's sustainable for me, nor is the assumption that I'll do it good for others getting better at it. 17:08
17:27 ggoebel left
jnthnwrthngtn dinner & 17:38
18:02 discord-raku-bot left, discord-raku-bot joined, reportable6 left 18:06 discord-raku-bot left 18:07 discord-raku-bot joined 18:11 vrurg left 18:12 vrurg joined 18:17 vrurg left
dogbert17 hmm, this is the kind of problem nine++ tends to eat for lunch :) 18:48
18:54 Xliff left
Altai-man and I have a golf 18:57
gist.github.com/Altai-man/f2e7816a...d5e72f283c 18:59
19:04 reportable6 joined
Altai-man m: class ASNType { has $.type is rw; }; my $new-type = Metamodel::ClassHOW.new_type(name => 'LDAPMessage'); my $attribute-type = ASNType.new(type => Int); my $attr = Attribute.new(name => '$!protocol-op', type => $attribute-type.type, package => $new-type, :has_accessor); $new-type.^add_attribute($attr); $new-type.^compose; say $new-type.new; 19:05
camelia Invocant of method 'raku' must be an object instance of type 'Mu', not
a type object of type 'Int'. Did you forget a '.new'?
in block <unit> at <tmp> line 1
19:05 Altai-man left 19:06 vrurg joined
jnthnwrthngtn I like short golfs and I cannnot lie... 21:02
21:11 linkable6 left
[Coke] ... did you already fix it?? 21:12
jnthnwrthngtn Yes :)
[Coke] www.youtube.com/watch?v=PSZy6lGgOcI 21:13
nine dogbert17: I might eat those for lunch, but jnthnwrthngtn++ eats those for a quick little snack in between 21:16
dogbert17 nine: you're up late 21:21
jnthnwrthngtn Wonder if GC debug options and/or a small nursery might narrow github.com/rakudo/rakudo/issues/4570 down...
dogbert17 jnthnwrthngtn: I ran with a 24k nursery 21:22
nine dogbert17: indeed. A friend came over and now I'm waiting till the bathroom's free
jnthnwrthngtn dogbert17: Ah, OK 21:24
Well, maybe I'll take a look tomorrow
dogbert17 I'll try a bit more and see if I can get better info 21:27
jnthnwrthngtn Nice, thanks 21:34
sena_kun jnthnwrthngtn++ # outstanding! 22:09
22:09 ggoebel joined
sena_kun also thanks for nudging me to golf it, it was kinda fun 22:10
22:22 ggoebel left 22:36 ggoebel joined