Description - phoronix/stress-ng

Stress-NG is a Linux stress tool developed by Colin King of Canonical.

According to this page, stress-ng is a more general purpose stress tool that checks various kernel interfaces in particular. Within Phoronix, the following subtests have been enabled:

Stress-NG 0.07.26:
    pts/stress-ng-1.2.1
    System Test Configuration
        1:  CPU Stress
        2:  Crypto
        3:  Memory Copying
        4:  Glibc Qsort Data Sorting
        5:  Glibc C String Functions
        6:  Vector Math
        7:  Matrix Math
        8:  Bsearch
        9:  Hsearch
        10: Lsearch
        11: Tsearch
        12: Forking
        13: System V Message Passing
        14: Semaphores
        15: Socket Activity
        16: Context Switching
        17: Test All Options
        Test: 

In the analysis below, I’ve run #15 (socket activity) and #13 (system V message passing) as these were exercised in this phoronix article. The runs below will show socket tests followed by message passing tests.

These sorts of tests are limited more by implementation than might be shown by traditional performance counters, but since these were easily collected will also include them below.

Metrics (Intel) - phoronix/stress-ng
sh - pid 12778 // socket
	On_CPU   0.999
	On_Core  7.988
	IPC      0.564
	Retire   0.381	(38.1%)
	FrontEnd 0.390	(39.0%)
	Spec     0.066	(6.6%)
	Backend  0.163	(16.3%)
	Elapsed  30.01
	Procs    19
	Maxrss   10K
	Minflt   1864
	Majflt   0
	Inblock  0
	Oublock  8
	Msgsnd   0
	Msgrcv   0
	Nsignals 0
	Nvcsw    5207353	(50.2%)
	Nivcsw   5160392
	Utime    10.813515
	Stime    228.918882
	Start    302230.18
	Finish   302260.19
sh - pid 12900 // message
	On_CPU   0.991
	On_Core  7.926
	IPC      0.530
	Retire   0.354	(35.4%)
	FrontEnd 0.314	(31.4%)
	Spec     0.063	(6.3%)
	Backend  0.270	(27.0%)
	Elapsed  30.02
	Procs    19
	Maxrss   10K
	Minflt   1874
	Majflt   0
	Inblock  0
	Oublock  8
	Msgsnd   0
	Msgrcv   0
	Nsignals 0
	Nvcsw    956140	(54.1%)
	Nivcsw   810229
	Utime    45.995359
	Stime    191.950657
	Start    302423.42
	Finish   302453.44

The driver occupies the CPU almost 100% of the time with primary performance counter limiter as frontend stalls. Message passing shows slightly higher amounts of backend stalls.

Metrics (AMD) - phoronix/stress-ng
sh - pid 31662 // socket
	On_CPU   0.998
	On_Core  15.971
	IPC      0.582
	FrontCyc 0.132	(13.2%)
	BackCyc  0.068	(6.8%)
	Elapsed  30.02
	Procs    35
	Maxrss   10K
	Minflt   2899
	Majflt   0
	Inblock  0
	Oublock  8
	Msgsnd   0
	Msgrcv   0
	Nsignals 0
	Nvcsw    21404922	(50.2%)
	Nivcsw   21257112
	Utime    13.372083
	Stime    466.069554
	Start    311413.35
	Finish   311443.37
sh - pid 31879 // message
	On_CPU   0.992
	On_Core  15.871
	IPC      0.563
	FrontCyc 0.057	(5.7%)
	BackCyc  0.069	(6.9%)
	Elapsed  30.02
	Procs    35
	Maxrss   10K
	Minflt   2836
	Majflt   0
	Inblock  0
	Oublock  8
	Msgsnd   0
	Msgrcv   0
	Nsignals 0
	Nvcsw    4578986	(50.9%)
	Nivcsw   4420861
	Utime    28.585237
	Stime    447.870134
	Start    311606.61
	Finish   311636.63

Metrics on my AMD system look similar.

Process Tree - phoronix/stress-ng
Process Tree
The user-level process tree is simple, with one driver process per core.

    12778) sh // socket
      12779) stress-ng
        12780) stress-ng
          12781) stress-ng-sock
            12784) stress-ng-sock
          12782) stress-ng-sock
            12786) stress-ng-sock
          12783) stress-ng-sock
            12788) stress-ng-sock
          12785) stress-ng-sock
            12789) stress-ng-sock
          12787) stress-ng-sock
            12791) stress-ng-sock
          12790) stress-ng-sock
            12793) stress-ng-sock
          12792) stress-ng-sock
            12795) stress-ng-sock
          12794) stress-ng-sock
            12796) stress-ng-sock

Socket version above.

    12900) sh
      12901) stress-ng
        12902) stress-ng
          12903) stress-ng-msg
            12907) stress-ng-msg
          12904) stress-ng-msg
            12908) stress-ng-msg
          12905) stress-ng-msg
            12910) stress-ng-msg
          12906) stress-ng-msg
            12911) stress-ng-msg
          12909) stress-ng-msg
            12912) stress-ng-msg
          12913) stress-ng-msg
            12916) stress-ng-msg
          12914) stress-ng-msg
            12918) stress-ng-msg
          12915) stress-ng-msg
            12917) stress-ng-msg

Message passing version above.


Looking at the total time across all cores show this is primarily a test of kernel interfaces and code. The socket tests are < 10% in user space while the message passing are ~20%

About this graph
Within the user space, some volatility of amount of user space across cores.


Somewhat expected, the IPC of this type of test is lower just a little less than 0.6.

About this graph
From a performance counter perspective, this shows a higher level of frontend stalls and some backend stalls. Interesting some variations shown in the backend stalls during some runs particularly for message passing.

Next steps: Understand other stress-ng workloads.