With the problem size bigger I see OSv consistently beating Linux host (at 
least on my laptop, Ubuntu 19.10).

Linux:
./radix -p 1 -r4096 -n16777216

Integer Radix Sort
     16777216 Keys
     1 Processors
     Radix = 4096
     Max key = 524288


                 PROCESS STATISTICS
               Total            Rank            Sort
 Proc          Time             Time            Time
    0         620025          127815          492206

                 TIMING INFORMATION
Start time                        : 1582659397056280
Initialization finish time        : 1582659400086786
Overall finish time               : 1582659400706811
Total time with initialization    :          3650531
Total time without initialization :           620025

./radix -p 2 -r4096 -n16777216

Integer Radix Sort
     16777216 Keys
     2 Processors
     Radix = 4096
     Max key = 524288


                 PROCESS STATISTICS
               Total            Rank            Sort
 Proc          Time             Time            Time
    0         333298           74005          258944

                 TIMING INFORMATION
Start time                        : 1582659471193401
Initialization finish time        : 1582659472761435
Overall finish time               : 1582659473094733
Total time with initialization    :          1901332
Total time without initialization :           333298

./radix -p 4 -r4096 -n16777216

Integer Radix Sort
     16777216 Keys
     4 Processors
     Radix = 4096
     Max key = 524288


                 PROCESS STATISTICS
               Total            Rank            Sort
 Proc          Time             Time            Time
    0         176586           38013          137823

                 TIMING INFORMATION
Start time                        : 1582659586192838
Initialization finish time        : 1582659586997985
Overall finish time               : 1582659587174571
Total time with initialization    :           981733
Total time without initialization :           176586

OSv:
./scripts/run.py -p qemu_microvm --qemu-path 
/home/wkozaczuk/projects/qemu/bin/release/native/x86_64-softmmu/qemu-system-x86_64
 
--nics 0 --nogdb -m 1G -c 1 --block-device-cache writeback,aio=threads -e 
'/radix -p 1 -r4096 -n16777216'
OSv v0.54.0-119-g4ee4b788
Booted up in 4.15 ms
Cmdline: /radix -p 1 -r4096 -n16777216 

Integer Radix Sort
     16777216 Keys
     1 Processors
     Radix = 4096
     Max key = 524288


                 PROCESS STATISTICS
               Total            Rank            Sort
 Proc          Time             Time            Time
    0         535304          130142          405145

                 TIMING INFORMATION
Start time                        : 1582659265555955
Initialization finish time        : 1582659268568276
Overall finish time               : 1582659269103580
Total time with initialization    :          3547625
Total time without initialization :           535304

./scripts/run.py -p qemu_microvm --qemu-path 
/home/wkozaczuk/projects/qemu/bin/release/native/x86_64-softmmu/qemu-system-x86_64
 
--nics 0 --nogdb -m 1G -c 2 --block-device-cache writeback,aio=threads -e 
'/radix -p 2 -r4096 -n16777216'
OSv v0.54.0-119-g4ee4b788
Booted up in 5.39 ms
Cmdline: /radix -p 2 -r4096 -n16777216 

Integer Radix Sort
     16777216 Keys
     2 Processors
     Radix = 4096
     Max key = 524288


                 PROCESS STATISTICS
               Total            Rank            Sort
 Proc          Time             Time            Time
    0         293180           78253          211421

                 TIMING INFORMATION
Start time                        : 1582659500041834
Initialization finish time        : 1582659501640537
Overall finish time               : 1582659501933717
Total time with initialization    :          1891883
Total time without initialization :           293180

./scripts/run.py -p qemu_microvm --qemu-path 
/home/wkozaczuk/projects/qemu/bin/release/native/x86_64-softmmu/qemu-system-x86_64
 
--nics 0 --nogdb -m 1G -c 4 --block-device-cache writeback,aio=threads -e 
'/radix -p 4 -r4096 -n16777216'
OSv v0.54.0-119-g4ee4b788
Booted up in 5.03 ms
Cmdline: /radix -p 4 -r4096 -n16777216 

Integer Radix Sort
     16777216 Keys
     4 Processors
     Radix = 4096
     Max key = 524288


                 PROCESS STATISTICS
               Total            Rank            Sort
 Proc          Time             Time            Time
    0         163844           47966          114362

                 TIMING INFORMATION
Start time                        : 1582659574048566
Initialization finish time        : 1582659575031430
Overall finish time               : 1582659575195274
Total time with initialization    :          1146708
Total time without initialization :           163844

So maybe (at least in this case) OSv scales pretty well with the number of 
CPUs:

Most likely because in this use case is very computation-heavy and OSv does 
not make many exits to the host (I wonder if OSv tracing mechanism has a 
way to show count of all exists). 

On Tuesday, February 25, 2020 at 2:12:10 PM UTC-5, [email protected] 
wrote:

> Wow, awesome results! I will try to reproduce shortly from here! If you 
> want to increase the problem size, add -n 16777216 (which is 64x bigger 
> than the current problem size of 262144, something will take take a couple 
> of seconds to run). 
>
> I am taking note of your commands to run the build and will be doing the 
> same on my machine to see what I produce. I will post screenshots :)
>
>
> On Tuesday, February 25, 2020 at 1:09:08 PM UTC-5, Waldek Kozaczuk wrote:
>>
>> So I did try to build and run the radix test (please note my Ubuntu 
>> laptop has only 4 cores and hyper-threading disabled). BTW it seems that 
>> particular benchmark does not need read-write FS so I used ROFS):
>>
>> ./scripts/manifest_from_host.sh -w ../splash2-posix/kernels/radix/radix 
>> && ./scripts/*build* fs=rofs --append-manifest -j4
>>
>> Linux host 1 cpu:
>>
>> ./radix -p 1 -r4096
>>
>>
>> Integer Radix Sort
>>
>>     262144 Keys
>>
>>     1 Processors
>>
>>     Radix = 4096
>>
>>     Max key = 524288
>>
>>
>>
>>                  PROCESS STATISTICS
>>
>>               Total            Rank            Sort
>>
>> Proc          Time             Time            Time
>>
>>    0           7335            2568            4765
>>
>>
>>                  TIMING INFORMATION
>>
>> Start time                        : 1582652832386234
>>
>> Initialization finish time        : 1582652832444092
>>
>> Overall finish time               : 1582652832451427
>>
>> Total time with initialization    :            65193
>>
>> Total time without initialization :             7335
>>
>>
>> Linux host 2 cpus:
>> ./radix -p 2 -r4096
>>
>> Integer Radix Sort
>>      262144 Keys
>>      2 Processors
>>      Radix = 4096
>>      Max key = 524288
>>
>>
>>                  PROCESS STATISTICS
>>                Total            Rank            Sort
>>  Proc          Time             Time            Time
>>     0           4325            1571            2704
>>
>>                  TIMING INFORMATION
>> Start time                        : 1582652821496771
>> Initialization finish time        : 1582652821531279
>> Overall finish time               : 1582652821535604
>> Total time with initialization    :            38833
>> Total time without initialization :             4325
>>
>> host 4 cpus:
>> ./radix -p 4 -r4096
>>
>> Integer Radix Sort
>>      262144 Keys
>>      4 Processors
>>      Radix = 4096
>>      Max key = 524288
>>
>>
>>                  PROCESS STATISTICS
>>                Total            Rank            Sort
>>  Proc          Time             Time            Time
>>     0           2599            1077            1470
>>
>>                  TIMING INFORMATION
>> Start time                        : 1582653906150199
>> Initialization finish time        : 1582653906171932
>> Overall finish time               : 1582653906174531
>> Total time with initialization    :            24332
>> Total time without initialization :             2599
>>
>>
>> OSv 1 CPU
>> ./scripts/run.py -p qemu_microvm --qemu-path 
>> /home/wkozaczuk/projects/qemu/bin/release/native/x86_64-softmmu/qemu-system-x86_64
>>  
>> --nics 0 --nogdb -m 64M -c 1 --block-device-cache writeback,aio=threads -e 
>> '/radix -p 1 -r4096'
>> OSv v0.54.0-119-g4ee4b788
>> Booted up in 3.75 ms
>> Cmdline: /radix -p 1 -r4096 
>>
>> Integer Radix Sort
>>      262144 Keys
>>      1 Processors
>>      Radix = 4096
>>      Max key = 524288
>>
>>
>>                  PROCESS STATISTICS
>>                Total            Rank            Sort
>>  Proc          Time             Time            Time
>>     0           6060            2002            4049
>>
>>                  TIMING INFORMATION
>> Start time                        : 1582652845450708
>> Initialization finish time        : 1582652845500348
>> Overall finish time               : 1582652845506408
>> Total time with initialization    :            55700
>> Total time without initialization :             6060
>>
>> OSv 2 CPUs:
>> ./scripts/run.py -p qemu_microvm --qemu-path 
>> /home/wkozaczuk/projects/qemu/bin/release/native/x86_64-softmmu/qemu-system-x86_64
>>  
>> --nics 0 --nogdb -m 64M -c 2 --block-device-cache writeback,aio=threads -e 
>> '/radix -p 2 -r4096'
>> OSv v0.54.0-119-g4ee4b788
>> Booted up in 4.81 ms
>> Cmdline: /radix -p 2 -r4096 
>>
>> Integer Radix Sort
>>      262144 Keys
>>      2 Processors
>>      Radix = 4096
>>      Max key = 524288
>>
>>
>>                  PROCESS STATISTICS
>>                Total            Rank            Sort
>>  Proc          Time             Time            Time
>>     0           5797            1702            4089
>>
>>                  TIMING INFORMATION
>> Start time                        : 1582653305076852
>> Initialization finish time        : 1582653305129792
>> Overall finish time               : 1582653305135589
>> Total time with initialization    :            58737
>> Total time without initialization :             5797
>>
>> OSv 4 cpus
>> ./scripts/run.py -p qemu_microvm --qemu-path 
>> /home/wkozaczuk/projects/qemu/bin/release/native/x86_64-softmmu/qemu-system-x86_64
>>  
>> --nics 0 --nogdb -m 64M -c 4 --block-device-cache writeback,aio=threads -e 
>> '/radix -p 4 -r4096'
>> OSv v0.54.0-119-g4ee4b788
>> Booted up in 5.26 ms
>> Cmdline: /radix -p 4 -r4096 
>>
>> Integer Radix Sort
>>      262144 Keys
>>      4 Processors
>>      Radix = 4096
>>      Max key = 524288
>>
>>
>>                  PROCESS STATISTICS
>>                Total            Rank            Sort
>>  Proc          Time             Time            Time
>>     0           6498            2393            4099
>>
>>                  TIMING INFORMATION
>> Start time                        : 1582653946823458
>> Initialization finish time        : 1582653946875522
>> Overall finish time               : 1582653946882020
>> Total time with initialization    :            58562
>> Total time without initialization :             6498
>>
>>
>> As you can see with single CPU the benchmark seems to be 10-15 % faster. 
>> But with two and four CPUs OSv barely sees any improvements, whereas on 
>> host the app runs 40% faster. So OSv does not seem to scale at all 
>> (somebody mentioned it used to) so it would be nice to understand why. OSv 
>> has many sophisticated tracing tools that can help here - 
>> https://github.com/cloudius-systems/osv/wiki/Trace-analysis-using-trace.py
>>
>> Waldek
>>
>> BTW1. I tried to bump size of the matrix to something higher but with 
>> -r8192 the app crashes on both Linux and OSv.
>> BTW2. It would be interestingly to compare OSv with Linux guest (vs host).
>>
>> On Tuesday, February 25, 2020 at 10:05:08 AM UTC-5, [email protected] 
>> wrote:
>>>
>>> Thanks for the response! I will get this information to you after work 
>>> with the few modifications you recommended! The application is essentially 
>>> just testing CPU performance using multiprocessing. Nothing too fancy about 
>>> it! The code I am using can be found at:
>>>
>>> https://www.github.com/ProfessorWest/splash2-posix
>>>
>>> In side of the kernels folder located at radix.c and I change the 
>>> problem size to 16,777,206. 
>>>
>>> If you happen to examine the code, do ignore the lacking cleanness of 
>>> the code...we just smashed everything into one file for simplicity on our 
>>> end. (Running the same code across all platforms being benchmarked). 
>>>
>>> On Tuesday, February 25, 2020 at 8:52:48 AM UTC-5, Waldek Kozaczuk wrote:
>>>>
>>>> Hi,
>>>>
>>>> I am quite late to the party :-) Could you run OSv on single CPU with 
>>>> verbose on (add -V to run.py) and send us the output so we can see a 
>>>> little 
>>>> more what is happening. To disable networking you need to add '--nics=0' 
>>>> (for all 50 options run.py supports run it with '--help'). I am not 
>>>> familiar with that benchmark but I wonder if it needs read-write FS (ZFS 
>>>> in 
>>>> OSv case), if not that you can build OSv images with read-only FS 
>>>> (./scripts/build fs=rofs). Lastly, you can improve boot time by running 
>>>> OSv 
>>>> on firecracker (
>>>> https://github.com/cloudius-systems/osv/wiki/Running-OSv-on-Firecracker) 
>>>> or on QEMU microvm (-p qemu_imcrovm - requires QEMU >= 4.1), with 
>>>> read-only 
>>>> FS on both OSv should boot within 5ms, ZFS within 40ms). Last thing - 
>>>> writing to console on OSv can be quite slow, I wonder how much this 
>>>> benchmark does it.
>>>>
>>>> While I definitely agree with my colleague Nadav, where he essentially 
>>>> says do not use OSv if the raw performance matters (database for example) 
>>>> and Linux will beat it no matter what, OSv may have advantages in use 
>>>> cases 
>>>> where pure performance does not matter (it still needs to be reasonable). 
>>>> I 
>>>> think the best use cases for OSv are serverless or stateless apps 
>>>> (microservices or web assembly) running on single CPU where all state 
>>>> management is delegated to a remote persistent store (most custom-built 
>>>> business apps are like that) and where high isolation matters. 
>>>>
>>>> Relatedly, I think it might be more useful to think of OSv (and other 
>>>> unikernels) as highly isolated processes. To that end, we still need to 
>>>> optimize memory overhead (stacks for example) and improve virtio-fs 
>>>> support 
>>>> (in this case to run the app on OSv you do not need full image, just 
>>>> kernel 
>>>> to run a Linux app).
>>>>
>>>> Also, I think the lack of good tooling in unikernel space affects their 
>>>> adoption. Compare it with docker - build, push, pull, run. OSv has its 
>>>> equivalent - capstan - but at this point, we do not really have a registry 
>>>> where one can pull the latest OSv kernel or push, pull images. Trying to 
>>>> run an app on OSv is still quite painful to a business app developer - it 
>>>> probably takes at least 30 minutes or so. 
>>>>
>>>> Lastly, I think one of the main reasons for Docker adoption, was 
>>>> repeatability (besides its fantastic ease of use) where one can create an 
>>>> image and expect it to run almost the same way in production. Imagine you 
>>>> can achieve that with OSv. 
>>>>
>>>> Waldek
>>>>
>>>> On Tuesday, February 25, 2020 at 7:00:16 AM UTC-5, [email protected] 
>>>> wrote:
>>>>>
>>>>> Very well explained. Thank you for that. That does make perfect sense 
>>>>> as well. 
>>>>
>>>>

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/osv-dev/4f08a5b2-59ef-453c-aa3c-0f5bcebcfe28%40googlegroups.com.

Reply via email to