Skip to content

Commit

Permalink
'io_uring' support to LISA
Browse files Browse the repository at this point in the history
Added 'io_uring' support to LISA io perf tests and new testcase 'perf_nvme_io_uring'
  • Loading branch information
SRIKKANTH committed Sep 16, 2024
1 parent a1358de commit 09959a5
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 8 deletions.
3 changes: 2 additions & 1 deletion lisa/tools/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
from .fallocate import Fallocate
from .fdisk import Fdisk
from .find import Find
from .fio import FIOMODES, Fio, FIOResult
from .fio import FIOMODES, Fio, FIOResult, IoEngine
from .firewall import Firewall, Iptables
from .free import Free
from .gcc import Gcc
Expand Down Expand Up @@ -159,6 +159,7 @@
"Ip",
"IpInfo",
"Iperf3",
"IoEngine",
"HibernationSetup",
"Hostname",
"Hugepages",
Expand Down
25 changes: 22 additions & 3 deletions lisa/tools/fio.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,16 @@ class FIOResult:
)


class IoEngine(Enum):
IO_URING = "io_uring"
LIBAIO = "libaio"
POSIXAIO = "posixaio"
NONE = ""

def __str__(self) -> str:
return self.value


class Fio(Tool):
fio_repo = "https://github.com/axboe/fio/"
branch = "fio-3.29"
Expand Down Expand Up @@ -93,6 +103,7 @@ def launch(
verify_dump: bool = False,
verify_fatal: bool = False,
verify: str = "",
ioengine: IoEngine = IoEngine.NONE,
cwd: Optional[pathlib.PurePath] = None,
) -> FIOResult:
cmd = self._get_command(
Expand All @@ -114,6 +125,7 @@ def launch(
verify_dump,
verify_fatal,
verify,
ioengine,
)
result = self.run(
cmd,
Expand Down Expand Up @@ -149,6 +161,7 @@ def launch_async(
verify_dump: bool = False,
verify_fatal: bool = False,
verify: str = "",
ioengine: IoEngine = IoEngine.NONE,
cwd: Optional[pathlib.PurePath] = None,
) -> Process:
cmd = self._get_command(
Expand All @@ -170,6 +183,7 @@ def launch_async(
verify_dump,
verify_fatal,
verify,
ioengine,
)
process = self.run_async(
cmd,
Expand Down Expand Up @@ -244,7 +258,7 @@ def create_performance_messages(
fio_message.append(fio_result_message)
return fio_message

def _get_command(
def _get_command( # noqa: C901
self,
name: str,
filename: str,
Expand All @@ -264,10 +278,15 @@ def _get_command(
verify_dump: bool = False,
verify_fatal: bool = False,
verify: str = "",
ioengine: IoEngine = IoEngine.LIBAIO,
) -> str:
ioengine = "posixaio" if isinstance(self.node.os, BSD) else "libaio"
if isinstance(self.node.os, BSD):
ioengine = IoEngine.POSIXAIO
elif ioengine == IoEngine.NONE:
ioengine = IoEngine.LIBAIO

cmd = (
f"--ioengine={ioengine} --filename={filename} "
f"--ioengine={ioengine.value} --filename={filename} "
f"--readwrite={mode} --iodepth={iodepth} "
f"--name={name}"
)
Expand Down
10 changes: 8 additions & 2 deletions microsoft/testsuites/performance/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
Ssh,
Sysctl,
)
from lisa.tools.fio import IoEngine
from lisa.tools.ntttcp import (
NTTTCP_TCP_CONCURRENCY,
NTTTCP_TCP_CONCURRENCY_BSD,
Expand All @@ -70,12 +71,14 @@ def perf_disk(
size_mb: int = 0,
numjob: int = 0,
overwrite: bool = False,
ioengine: IoEngine = IoEngine.NONE,
cwd: Optional[pathlib.PurePath] = None,
) -> None:
fio_result_list: List[FIOResult] = []
fio = node.tools[Fio]
numjobiterator = 0
# In fio test, numjob*max_iodepth (aio-nr) should always be less than aio-max-nr.
# In fio test with ioengine == 'libaio',
# numjob*max_iodepth (aio-nr) should always be less than aio-max-nr.
# The default value of aio-max-nr is 65536.
# As max_iodepth is 256, numjob which is equal to 'nproc' should not exceed 256.
# /proc/sys/fs/aio-nr is the number of events currently active.
Expand All @@ -84,7 +87,9 @@ def perf_disk(
# fail with EAGAIN.
# read: https://www.kernel.org/doc/Documentation/sysctl/fs.txt
# So we set numjob to 256 if numjob is larger than 256.
numjob = min(numjob, 256)
# This limitation is only needed for 'libaio' ioengine but not for 'io_uring'.
if ioengine == IoEngine.LIBAIO:
numjob = min(numjob, 256)
for mode in FIOMODES:
iodepth = start_iodepth
numjobindex = 0
Expand All @@ -102,6 +107,7 @@ def perf_disk(
overwrite=overwrite,
numjob=numjob,
cwd=cwd,
ioengine=ioengine,
)
fio_result_list.append(fio_result)
iodepth = iodepth * 2
Expand Down
24 changes: 22 additions & 2 deletions microsoft/testsuites/performance/nvmeperf.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from lisa.messages import DiskSetupType, DiskType
from lisa.testsuite import TestResult
from lisa.tools import Echo, Lscpu
from lisa.tools.fio import IoEngine
from microsoft.testsuites.performance.common import perf_disk


Expand All @@ -24,7 +25,7 @@
""",
)
class NvmePerformace(TestSuite):
TIME_OUT = 5000
TIME_OUT = 7200

@TestCaseMetadata(
description="""
Expand All @@ -37,6 +38,25 @@ class NvmePerformace(TestSuite):
),
)
def perf_nvme(self, node: Node, result: TestResult) -> None:
self._perf_nvme(node, IoEngine.LIBAIO, result)

@TestCaseMetadata(
description="""
This test case uses fio to test NVMe disk performance
with 'io_uring' as ioengine.
""",
priority=3,
timeout=TIME_OUT,
requirement=simple_requirement(
supported_features=[Nvme],
),
)
def perf_nvme_io_uring(self, node: Node, result: TestResult) -> None:
self._perf_nvme(node, IoEngine.IO_URING, result, max_iodepth=1024)

def _perf_nvme(
self, node: Node, ioengine: IoEngine, result: TestResult, max_iodepth: int = 256
) -> None:
nvme = node.features[Nvme]
nvme_namespaces = nvme.get_raw_nvme_disks()
disk_count = len(nvme_namespaces)
Expand All @@ -59,7 +79,6 @@ def perf_nvme(self, node: Node, result: TestResult) -> None:
cpu = node.tools[Lscpu]
core_count = cpu.get_core_count()
start_iodepth = 1
max_iodepth = 256
perf_disk(
node,
start_iodepth,
Expand All @@ -71,4 +90,5 @@ def perf_nvme(self, node: Node, result: TestResult) -> None:
disk_setup_type=DiskSetupType.raw,
disk_type=DiskType.nvme,
test_result=result,
ioengine=ioengine,
)

0 comments on commit 09959a5

Please sign in to comment.