Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 22 Mar 2023 19:44:19 -0700
From:      Mark Millard <marklmi@yahoo.com>
To:        George Mitchell <george+freebsd@m5p.com>
Cc:        FreeBSD Hackers <freebsd-hackers@freebsd.org>
Subject:   Re: Periodic rant about SCHED_ULE
Message-ID:  <F9A9FCBF-C46A-455C-A18F-277521BFF2A4@yahoo.com>
In-Reply-To: <0196A767-5DC2-4DA3-BA5E-62A358CBCF64@yahoo.com>
References:  <6BD317F2-7EDD-45C0-9DC9-5B94C1BBB8E1.ref@yahoo.com> <6BD317F2-7EDD-45C0-9DC9-5B94C1BBB8E1@yahoo.com> <952d9795-19dc-8ad1-bb75-5c556ca6795a@m5p.com> <E8A93C10-F5A4-4473-9AED-299C108CAD6C@yahoo.com> <78EF511D-BAF1-495F-BAC9-03AC1B8FD56A@yahoo.com> <A0F19E2A-A63E-4CBD-B962-CEEC455BBC0A@yahoo.com> <E30D9325-60C4-42A8-9929-5F51F8F102E0@yahoo.com> <0196A767-5DC2-4DA3-BA5E-62A358CBCF64@yahoo.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mar 22, 2023, at 18:08, Mark Millard <marklmi@yahoo.com> wrote:

> On Mar 22, 2023, at 18:03, Mark Millard <marklmi@yahoo.com> wrote:
>=20
>> On Mar 22, 2023, at 16:17, Mark Millard <marklmi@yahoo.com> wrote:
>>=20
>>> On Mar 22, 2023, at 15:39, Mark Millard <marklmi@yahoo.com> wrote:
>>>=20
>>>> On Mar 22, 2023, at 13:34, Mark Millard <marklmi@yahoo.com> wrote:
>>>>=20
>>>>> On Mar 22, 2023, at 12:40, George Mitchell =
<george+freebsd@m5p.com> wrote:
>>>>>=20
>>>>>> On 3/22/23 15:21, Mark Millard wrote:
>>>>>>> George Mitchell <george+freebsd@m5p.com> wrote on
>>>>>>> Date: Wed, 22 Mar 2023 17:36:39 UTC :
>>>>>>> [...]
>>>>>>>> Here are the very complicated instructions for reproducing the =
problem:
>>>>>>>> 1. Install and start misc/dnetc from ports.
>>>>>>> Installing is likely easy, as likely would be building
>>>>>>> with default options (if any). I know nothing about
>>>>>>> starting misc/dnetc so that is research. (Possibly
>>>>>>> trivial, although if it has alternatives to control
>>>>>>> then I'd need to match that context too.)
>>>>>>=20
>>>>>> service dnetc start
>>>>>=20
>>>>> I built and installed misc/dnetc and got a binary
>>>>> blob that clearly was not built in my environment:
>>>>>=20
>>>>> # file /usr/local/distributed.net/dnetc
>>>>> /usr/local/distributed.net/dnetc: ELF 64-bit LSB executable, =
x86-64, version 1 (FreeBSD), statically linked, for FreeBSD 10.1 =
(1001515), FreeBSD-style, stripped
>>>>>=20
>>>>> Way older FreeBSD vintage than the locally available toolchains
>>>>> would normally build. Some might be cautious about such a thing.
>>>>>=20
>>>>> The man page reported that:
>>>>>=20
>>>>> QUOTE
>>>>> If you have never run the client before, it will initiate the =
menu-driven
>>>>> configuration. Save and quit when done, the configuration file =
will be
>>>>> saved in the same directory as the client. Now, simply restart the
>>>>> client. =46rom that point on it will use the saved configuration.
>>>>> END QUOTE
>>>>>=20
>>>>> I've not seen what the configuration asks about yet.
>>>>=20
>>>> I went through the configuration, basically just looking
>>>> at it, other than providing an E-mail address. Then . . .
>>>>=20
>>>> $ sudo service dnetc start
>>>> Password:
>>>> Cannot 'start' dnetc. Set dnetc_enable to YES in /etc/rc.conf or =
use 'onestart' instead of 'start'.
>>>>=20
>>>> $ sudo service dnetc onestart
>>>>=20
>>>> I just let it run without any extra competing activity, other
>>>> than I had my patched version of top running. It records and
>>>> reports various maximum-observed (MaxObs) figures, here
>>>> the load averages being relevant.
>>>>=20
>>>> Top showed that dnetc started 32 processes, one per hardware
>>>> thread. Mostly I saw: 100% nice and 0% idle.
>>>>=20
>>>> Letting it run and then looking at the load averages (and
>>>> their matching MaxObs figures) after something like 60+ min
>>>> (not carefully timed: was doing other things) showed:
>>>>=20
>>>> load averages:  31.97,  31.88,  31.66 MaxObs:  32.12,  31.97,  =
31.66
>>>>=20
>>>> (Note: The machine had been up for over 2.75 days before
>>>> starting this and had not been building much of anything
>>>> during that time.)
>>>>=20
>>>> I've not yet experimented with having other, significant
>>>> competing activity.
>>>>=20
>>>>>>>> 2. Run "make buildworld".
>>>>>>> So on the 32 hardware-thread (16 cores) amd64 machine that
>>>>>>> I have access to, the test is to only have buildworld use
>>>>>>> about one hardware thread, no matter what else is going on.
>>>>>>> I never would have guessed that the steps would not involve
>>>>>>> more like -j$(sysctl -n hw.ncpu) (so around -j32 in this
>>>>>>> context). So it is good that you provided your note or
>>>>>>> I'd not know if I'd done similarly or not when trying such.
>>>>>>> [Note: -j1 and lack of -j are not strictly equivalent in
>>>>>>> how make operates. As I remember, the distinction makes
>>>>>>> a notable difference in the number of subprocesses created
>>>>>>> directly by make (one per action "line" vs. one for the
>>>>>>> whole block?). So even using -j1 might make a difference
>>>>>>> vs. what you specified. I'd have to test to see.]
>>>>>>=20
>>>>>> I am literally running "make buildworld" with no additional =
options.
>>>>>=20
>>>>> So required for repeating your results, but likely making
>>>>> such results not be interesting relative to how I normally
>>>>> deal with buildworld buildkernel and the likel, no matter
>>>>> if there is other activity in an overlapping time frame or
>>>>> not: my time preferences are too strong to wait for a single
>>>>> hardware thread to do my normal builds, even with no
>>>>> competing activity on the builder.
>>>>>=20
>>>>>>>> Standard out conveniently reports how long it took (wall =
clock).
>>>>>>> But nothing in your instructions indicate about how
>>>>>>> to get an idea much progress dnetc made during the
>>>>>>> various tests? [...]
>>>>>>=20
>>>>>> Honestly, I've never worried about this part.  But dnetc logs its
>>>>>> progress in /usr/local/distributed.net/dnetc.txt, though not in =
terms
>>>>>> that are easy to relate to real-world progress.  Oddly, when I =
run
>>>>>> "make buildworld," I'm primarily interested in getting the world =
built.
>>>>>> Perhaps others feel differently.
>>>>>=20
>>>>> Off topic for the specifics of the actual benchmark
>>>>> that you run:
>>>>>=20
>>>>> Then why not use of -jN ? In my context, any buildworld
>>>>> using -j1 or no -j at all takes a huge amount of time
>>>>> longer than letting it use all the hardware threads (or
>>>>> so). (I've avoided having any I/O bound contexts for
>>>>> such.) It does not take additional load on the system
>>>>> for that to be true --including on the 4-core small arm
>>>>> boards when I happen to buildworld on such (rare).
>>>>>=20
>>>>>=20
>>>>>>> [...]
>>>>>>> FYI: I've never built with and run the alternate
>>>>>>> scheduler so if there is any appropriate background
>>>>>>> for that that would not be obvious on finding basic
>>>>>>> instructions, it would be appropriate to provide
>>>>>>> such notes.
>>>>>>> [...]
>>>>>>=20
>>>>>> You have to build a new kernel, using a config file in which you =
have
>>>>>> replaced "options SCHED_ULE" with "options SCHED_4BSD".     -- =
George
>>>>>=20
>>>>> Thanks for the notes.
>>>>>=20
>>>>> I've not decided if I'll do anything with the binary
>>>>> blob or not.
>>>>=20
>>>=20
>>> FYI:
>>>=20
>>> It is not your specific experiment, but I started my
>>> "extra load" experimenst with . . .
>>>=20
>>> I started a -j32 buildworld buildkernel with dnetc still
>>> running. I'm generally seeing around 55% Active and 42%
>>=20
>> Note "Active": user, sorry.
>>=20
>>> nice, < 2% system (it was building libllvm at this point).
>>> At that time:
>>>=20
>>> load averages:  64.41,  60.52,  49.81 MaxObs:  64.47,  60.52,  49.81
>>>=20
>>=20
>> Contrasting results for some obj-lib32 build activity:
>> much more variety of User, nice, and system, including
>> times with < 5% user, 90+% nice. But not typical overall.
>> But lots of time roughly around 50%/50% or 35%/60%. There
>> were times with 15+% system.
>>=20
>> Somewhat after buildkernel started:
>>=20
>> load averages:  69.15,  64.12,  58.72 MaxObs:  75.98,  64.12,  58.72
>>=20
>> Harder to summarize, so overall timing reports from the
>> buildworld and buildkernel stages.
>>=20
>>=20
>> buildworld:
>>=20
>> --------------------------------------------------------------
>> ... World build completed on Wed Mar 22 16:37:57 PDT 2023
>> ... World built in 2615 seconds, ncpu: 32, make -j32
>> --------------------------------------------------------------
>>=20
>>=20
>> buildkernel:
>>=20
>> --------------------------------------------------------------
>> ... Kernel build for GENERIC-NODBG completed on Wed Mar 22 16:43:10 =
PDT 2023
>> --------------------------------------------------------------
>> ... Kernel(s)  GENERIC-NODBG built in 311 seconds, ncpu: 32, make =
-j32
>> --------------------------------------------------------------
>>=20
>> Afterwards:
>>=20
>> load averages:  36.08,  53.14,  55.79 MaxObs:  75.98,  65.77,  59.84
>>=20
>>=20
>> I then did (not all in the same window):
>>=20
>> $ sudo service dnetc onestop
>> # rm -fr /usr/obj/BUILDs/main-amd64-nodbg-clang-alt/usr/
>>=20
>> before another -j32 buildworld buildkernel (no dnetc). The
>> reuslts for this were:
>>=20
>>=20
>> buildworld:
>>=20
>> --------------------------------------------------------------
>> ... World build completed on Wed Mar 22 17:39:19 PDT 2023
>> ... World built in 1240 seconds, ncpu: 32, make -j32
>> --------------------------------------------------------------
>>=20
>> (compared to the 2615 for dnetc also in use)
>>=20
>>=20
>> buildkernel:
>>=20
>> --------------------------------------------------------------
>> ... Kernel build for GENERIC-NODBG completed on Wed Mar 22 17:41:17 =
PDT 2023
>> --------------------------------------------------------------
>> ... Kernel(s)  GENERIC-NODBG built in 118 seconds, ncpu: 32, make =
-j32
>> --------------------------------------------------------------
>>=20
>> (compared to the 311 for dnetc also in use)
>=20
> I forgot to show the MaxObs load averages for the no-dnetc
> context:
>=20
> MaxObs:  39.77,  32.15,  25.75
>=20
>> Experiments without -j32 will take a lot longer, even
>> without dnetc in use. I'm not sure there will be such
>> results today.
>>=20
>=20

I decided to do some more of the less time consuming
testing. SCHED_4BSD, no dnetc, -j32 buildworld buildkernel :


buildworld:

--------------------------------------------------------------
... World build completed on Wed Mar 22 19:16:35 PDT 2023
... World built in 1235 seconds, ncpu: 32, make -j32
--------------------------------------------------------------

(compared to 1240 for SCHED_ULE)

So: no significant difference.


buildkernel (SCHED_4BSD building a SCHED_4BSD):

--------------------------------------------------------------
... Kernel build for GENERIC-NODBG-SCHED_4BSD completed on Wed Mar 22 =
19:18:34 PDT 2023
--------------------------------------------------------------
... Kernel(s)  GENERIC-NODBG-SCHED_4BSD built in 119 seconds, ncpu: 32, =
make -j32
--------------------------------------------------------------

(compared to 118 for SCHED_ULE building a SCHED_ULE)

So: no significant difference.


I'll try it with dnetc also active.


=3D=3D=3D
Mark Millard
marklmi at yahoo.com




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?F9A9FCBF-C46A-455C-A18F-277521BFF2A4>