stress-ng will stress test a computer system in various selectable ways. It was designed to exercise various physical subsystems of a computer as well as the various operating system kernel interfaces. Stress-ng features:
- Over 270 stress tests
- 85+ CPU specific stress tests that exercise floating point, integer, bit manipulation and control flow
- over 20 virtual memory stress tests
- portable: builds on Linux, Solaris, *BSD, Minix, Android, MacOS X, GNU/Hurd, Haiku, Windows Subsystem for Linux and SunOs/Dilos with gcc, clang, icc, tcc and pcc.
- tested on alpha, armhf, arm64, hppa, i386, m68k, mips32, mips64, ppc64el, risc-v, s390x, sparc64, x86-64
stress-ng was originally intended to make a machine work hard and trip hardware issues such as thermal overruns as well as operating system bugs that only occur when a system is being thrashed hard. Use stress-ng with caution as some of the tests can make a system run hot on poorly designed hardware and also can cause excessive system thrashing which may be difficult to stop.
stress-ng can also measure test throughput rates; this can be useful to observe performance changes across different operating system releases or types of hardware. However, it has never been intended to be used as a precise benchmark test suite, so do NOT use it in this manner.
Running stress-ng with root privileges will adjust out of memory settings on Linux systems to make the stressors unkillable in low memory situations, so use this judiciously. With the appropriate privilege, stress-ng can allow the ionice class and ionice levels to be adjusted, again, this should be used with care.
Tarballs of each version of stress-ng can be downloaded using the URL:
https://github.com/ColinIanKing/stress-ng/tarball/version
where version is the relevant version number, for example:
https://github.com/ColinIanKing/stress-ng/tarball/V0.13.05
To build, the following libraries will ensure a fully functional stress-ng build: (note libattr is not required for more recent disto releases).
Debian, Ubuntu:
- libaio-dev
- libapparmor-dev
- libattr1-dev
- libbsd-dev
- libcap-dev
- libgcrypt11-dev
- libipsec-mb-dev
- libjudy-dev
- libkeyutils-dev
- libsctp-dev
- libatomic1
- zlib1g-dev
- libkmod-dev
- libxxhash-dev
RHEL, Fedora, Centos:
- libaio-devel
- libattr-devel
- libbsd-devel
- libcap-devel
- libgcrypt-devel
- Judy-devel
- keyutils-libs-devel
- lksctp-tools-devel
- libatomic
- zlib-devel
- kmod-devel
- xxhash-devel
RHEL, Fedora, Centos (static builds):
- libaio-devel
- libattr-devel
- libbsd-devel
- libcap-devel
- libgcrypt-devel
- Judy-devel
- keyutils-libs-devel
- lksctp-tools-devel
- libatomic-static
- zlib-devel
- glibc-static
- xxhash-devel
SUSE:
- keyutils-devel
- libaio-devel
- libapparmor-devel
- libattr-devel
- libbsd-devel
- libcap-devel
- libseccomp-devel
- lksctp-tools-devel
- libatomic1
- zlib-devel
- libkmod-devel
- xxhash-devel
NOTE: the build will try to detect build dependencies and will build an image with functionality disabled if the support libraries are not installed.
At build-time stress-ng will detect kernel features that are available on the target build system and enable stress tests appropriately. Stress-ng has been build-tested on Ubuntu, Debian, Debian GNU/Hurd, Slackware, RHEL, SLES, Centos, kFreeBSD, OpenBSD, NetBSD, FreeBSD, Debian kFreeBSD, DragonFly BSD, OS X, Minix, Solaris 11.3, OpenIndiana and Hiaku. Ports to other POSIX/UNIX like operating systems should be relatively easy.
NOTE: ALWAYS run make clean
after fetching changes from the git repository
to force the build to regenerate the build configuration file.
To build on BSD systems, one requires gcc and GNU make:
CC=gcc gmake clean
CC=gcc gmake
To build on OS X systems, just use:
make clean
make
To build on MINIX, gmake and clang are required:
CC=clang gmake clean
CC=clang gmake
To build on SunOS, one requires GCC and GNU make, build using:
CC=gcc gmake clean
CC=gcc gmake
To build on Dilos, one requires GCC and GNU make, build using:
CC=gcc gmake clean
CC=gcc gmake
To build on Haiku Alpha 4:
make clean
make
To build a static image (example, for Android), use:
make clean
STATIC=1 make
To build with full warnings enabled:
make clean
PEDANTIC=1 make
To build with the Tiny C compiler:
make clean
CC=tcc make
To build with the PCC portable C compiler use:
make clean
CC=pcc make
To build with the musl C library:
CC=musl-gcc make
To build with the Intel C compiler use:
make clean
CC=icc make
Send patches to colin.i.king@gmail.com or merge requests at https://github.com/ColinIanKing/stress-ng
The Ubuntu stress-ng reference guide contains a brief overview and worked examples.
Run 4 CPU, 2 virtual memory, 1 disk and 8 fork stressors for 2 minutes and print measurements:
stress-ng --cpu 4 --vm 2 --hdd 1 --fork 8 --timeout 2m --metrics
stress-ng: info: [573366] setting to a 120 second (2 mins, 0.00 secs) run per stressor
stress-ng: info: [573366] dispatching hogs: 4 cpu, 2 vm, 1 hdd, 8 fork
stress-ng: info: [573366] successful run completed in 123.78s (2 mins, 3.78 secs)
stress-ng: info: [573366] stressor bogo ops real time usr time sys time bogo ops/s bogo ops/s CPU used per
stress-ng: info: [573366] (secs) (secs) (secs) (real time) (usr+sys time) instance (%)
stress-ng: info: [573366] cpu 515396 120.00 453.02 0.18 4294.89 1137.24 94.42
stress-ng: info: [573366] vm 2261023 120.01 223.80 1.80 18840.15 10022.27 93.99
stress-ng: info: [573366] hdd 367558 123.78 10.63 11.67 2969.49 16482.42 18.02
stress-ng: info: [573366] fork 598058 120.00 68.24 65.88 4983.80 4459.13 13.97
Run matrix stressor on all online CPUs for 60 seconds and measure temperature:
stress-ng --matrix -1 --tz -t 60
stress-ng: info: [1171459] setting to a 60 second run per stressor
stress-ng: info: [1171459] dispatching hogs: 8 matrix
stress-ng: info: [1171459] successful run completed in 60.01s (1 min, 0.01 secs)
stress-ng: info: [1171459] matrix:
stress-ng: info: [1171459] acpitz0 75.00 C (348.15 K)
stress-ng: info: [1171459] acpitz1 75.00 C (348.15 K)
stress-ng: info: [1171459] pch_skylake 60.17 C (333.32 K)
stress-ng: info: [1171459] x86_pkg_temp 62.72 C (335.87 K)
Run a mix of 4 I/O stressors and check for changes in disk S.M.A.R.T. metadata:
sudo stress-ng --iomix 4 --smart -t 30s
stress-ng: info: [1171471] setting to a 30 second run per stressor
stress-ng: info: [1171471] dispatching hogs: 4 iomix
stress-ng: info: [1171471] successful run completed in 30.37s
stress-ng: info: [1171471] Device ID S.M.A.R.T. Attribute Value Change
stress-ng: info: [1171471] sdc 01 Read Error Rate 88015771 71001
stress-ng: info: [1171471] sdc 07 Seek Error Rate 59658169 92
stress-ng: info: [1171471] sdc c3 Hardware ECC Recovered 88015771 71001
stress-ng: info: [1171471] sdc f1 Total LBAs Written 481904395 877
stress-ng: info: [1171471] sdc f2 Total LBAs Read 3768039248 5139
stress-ng: info: [1171471] sdd be Temperature Difference 3670049 1
Benchmark system calls using the VDSO:
stress-ng --vdso 1 -t 5 --metrics
stress-ng: info: [1171584] setting to a 5 second run per stressor
stress-ng: info: [1171584] dispatching hogs: 1 vdso
stress-ng: info: [1171585] stress-ng-vdso: exercising vDSO functions: clock_gettime time gettimeofday getcpu
stress-ng: info: [1171585] stress-ng-vdso: 9.88 nanoseconds per call (excluding 1.73 nanoseconds test overhead)
stress-ng: info: [1171584] successful run completed in 5.10s
stress-ng: info: [1171584] stressor bogo ops real time usr time sys time bogo ops/s bogo ops/s CPU used per
stress-ng: info: [1171584] (secs) (secs) (secs) (real time) (usr+sys time) instance (%)
stress-ng: info: [1171584] vdso 430633496 5.10 5.10 0.00 84375055.96 84437940.39 99.93
stress-ng: info: [1171584] vdso 9.88 nanoseconds per call (average per stressor)
Generate and measure branch misses using perf metrics:
sudo stress-ng --branch 1 --perf -t 10 2>& 1 | grep Branch
stress-ng: info: [1171714] 604,703,327 Branch Instructions 53.30 M/sec
stress-ng: info: [1171714] 598,760,234 Branch Misses 52.77 M/sec (99.02%)
stress-ng has found several Linux Kernel bugs and appropriate fixes have been landed to address these issues:
- fs/locks.c: kernel oops during posix lock stress test
- rcu_preempt detected stalls on CPUs/tasks
- BUG: unable to handle kernel NULL pointer dereference
- WARNING: possible circular locking dependency detected
- SMP divide error
- ext4_validate_inode_bitmap:99: comm stress-ng: Corrupt inode bitmap
- 4.15 s390x kernel BUG at /build/linux-Gycr4Z/linux-4.15.0/drivers/block/virtio_blk.c:565
- mm/page_idle.c: fix oops because end_pfn is larger than max_pfn
- Illumos: ofdlock(): assertion failed: lckdat->l_start == 0
- mm: compaction: avoid 100% CPU usage during compaction when a task is killed
- mm/vmalloc.c: preload a CPU with one object for split purpose
- debugobjects: Use global free list in __debug_check_no_obj_freed()
- ARM: dts: meson8b: add reserved memory zone to fix silent freezes
- ARM64: dts: meson-gx: Add firmware reserved memory zones
- sched/core: Fix a race between try_to_wake_up() and a woken up task
- ext4: lock the xattr block before checksuming it
- devpts: fix null pointer dereference on failed memory allocation
- KEYS: ensure we free the assoc array edit if edit is valid
- arm64: do not enforce strict 16 byte alignment to stack pointer
- proc: fix -ESRCH error when writing to /proc/$pid/coredump_filter
- perf evlist: Use unshare(CLONE_FS) in sb threads to let setns(CLONE_NEWNS) work
- riscv: reject invalid syscalls below -1
- RISC-V: Don't allow write+exec only page mapping request in mmap
- riscv: set max_pfn to the PFN of the last page
- crypto: hisilicon - update SEC driver module parameter
- net: atm: fix update of position index in lec_seq_next
- sched/debug: Fix memory corruption caused by multiple small reads of flags
- ocfs2: ratelimit the 'max lookup times reached' notice
- using perf can crash kernel with a stack overflow
- stress-ng on gcov enabled focal kernel triggers OOPS
- sparc64: Fix opcode filtering in handling of no fault loads
- opening a file with O_DIRECT on a file system that does not support it will leave an empty file
- sparc64: locking/atomic, kernel OOPS on running stress-ng
- btrfs: fix exhaustion of the system chunk array due to concurrent allocations
- btrfs: rework chunk allocation to avoid exhaustion of the system chunk array
- btrfs: fix deadlock with concurrent chunk allocations involving system chunks
- locking/atomic: sparc: Fix arch_cmpxchg64_local()
- pipe: do FASYNC notifications for every pipe IO, not just state changes
- io-wq: remove GFP_ATOMIC allocation off schedule out path
- mm/swap: consider max pages in iomap_swapfile_add_extent
- copy_process(): Move fd_install() out of sighand->siglock critical section
- selinux: complete the inlining of hashtab functions
- selinux: store role transitions in a hash table
- sched/rt: Optimize checking group RT scheduler constraints
- sched/fair: handle case of task_h_load() returning 0
- sched/deadline: Unthrottle PI boosted threads while enqueuing
- mm: fix madvise WILLNEED performance problem
- powerpc/dma: Fix dma_map_ops::get_required_mask
- Revert "mm, slub: consider rest of partial list if acquire_slab() fails
- mm: memory: add orig_pmd to struct vm_fault
- selftests/powerpc: Add test of mitigation patching
- dm crypt: Avoid percpu_counter spinlock contention in crypt_page_alloc()
- mm/migrate: optimize hotplug-time demotion order updates
- powerpc/rtas: rtas_busy_delay() improvements
- sched/core: Accounting forceidle time for all tasks except idle task
- Auto-scaling of Containers: the impact of Relative and Absolute Metrics
- Increasing Platform Determinism PQOS DPDK
- Testing the Windows Subsystem for Linux
- Practical analysis of the Precision Time Protocol under different types of system load
- Towards Virtual Machine Energy-Aware Cost Prediction in Clouds
- Towards Energy Efficient Data Management in HPC: The Open Ethernet Drive Approach
- Enhancing Cloud energy models for optimizing datacenters efficiency
- CPU and memory performance analysis on dynamic and dedicated resource allocation using XenServer in Data Center environment
- Algorithms and Architectures for Parallel Processing
- Advanced concepts and tools for renewable energy supply of IT Data Centres
- How Much Power Does your Server Consume? Estimating Wall Socket Power Using RAPL Measurements
- Tejo: A Supervised Anomaly Detection Scheme for NewSQL Databases
- Monitoring and Modelling Open Compute Servers
- Experimental and numerical analysis for potential heat reuse in liquid cooled data centres
- DevOps for IoT Applications using Cellular Networks and Cloud
- Modeling and Analysis of Performance under Interference in the Cloud
- Effectively Measure and Reduce Kernel Latencies for Real time Constraints
- Monitoring and Analysis of CPU load relationships between Host and Guests in a Cloud Networking Infrastructure
- Measuring the impacts of the Preempt-RT patch
- Multicore Emulation on Virtualised Environment
- Stress-SGX : Load and Stress your Enclaves for Fun and Profit
- Reliable Library Identification Using VMI Techniques
- Elastic-PPQ: A two-level autonomic system for spatial preference query processing over dynamic data stream
- Caliper Benchmarking
- OpenEPC integration within 5GTN as an NFV proof of concept
- quiho: Automated Performance Regression Testing Using Inferred Resource Utilization Profiles
- A Virtual Network Function Workload Simulator
- Time-Aware Dynamic Binary Instrumentation
- Characterizing and Reducing Cross-Platform Performance Variability Using OS-level Virtualization
- Experience Report: Log Mining using Natural Language Processing and Application to Anomaly Detection
- CoMA: Resource Monitoring of Docker Containers
- An Investigation of CPU utilization relationship between host and guests in a Cloud infrastructure
- Hypervisor and Virtual Machine Memory Optimization Analysis
- Linux kernel performance test tool
- Real-Time testing with Fuego
- Performance and Energy Trade-Offs for Parallel Applications on Heterogeneous Multi-Processing Systems
- C-Balancer: A System for Container Profiling and Scheduling
- Modelling VM Latent Characteristics and Predicting Application Performance using Semi-supervised Non-negative Matrix Factorization
- Semi-dynamic load balancing: efficient distributed learning in non-dedicated environments
- Streamline: A Fast, Flushless Cache Covert-Channel Attack byEnabling Asynchronous Collusion
- Experimental Analysis in Hadoop MapReduce: A Closer Look at Fault Detection and Recovery Techniques
- Performance Characteristics of theBlueField-2 SmartNIC
- Evaluating Latency in Multiprocessing Embedded Systems for the Smart Grid
- Work-in-Progress: Timing Diversity as a Protective Mechanism
- Sequential Deep Learning Architectures for Anomaly Detection in Virtual Network Function Chains
- WattEdge: A Holistic Approach for Empirical Energy Measurements in Edge Computing
- FECBench: An Extensible Framework for Pinpointing Sources of Performance Interference in the Cloud-Edge Resource Spectrum
- A general method for evaluating the overhead when consolidating servers: performance degradation in virtual machines and containers
I am keen to add to the stress-ng project page any citations to research or projects that use stress-ng. I also appreciate information concerning kernel bugs or performance regressions found with stress-ng.