Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

io_uring support #3419

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
22 changes: 19 additions & 3 deletions lisa/tools/fio.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,15 @@ class FIOResult:
)


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

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 +102,7 @@ def launch(
verify_dump: bool = False,
verify_fatal: bool = False,
verify: str = "",
ioengine: IoEngine = IoEngine.LIBAIO,
cwd: Optional[pathlib.PurePath] = None,
) -> FIOResult:
cmd = self._get_command(
Expand All @@ -114,6 +124,7 @@ def launch(
verify_dump,
verify_fatal,
verify,
ioengine,
)
result = self.run(
cmd,
Expand Down Expand Up @@ -149,6 +160,7 @@ def launch_async(
verify_dump: bool = False,
verify_fatal: bool = False,
verify: str = "",
ioengine: IoEngine = IoEngine.LIBAIO,
cwd: Optional[pathlib.PurePath] = None,
) -> Process:
cmd = self._get_command(
Expand All @@ -170,6 +182,7 @@ def launch_async(
verify_dump,
verify_fatal,
verify,
ioengine,
)
process = self.run_async(
cmd,
Expand Down Expand Up @@ -244,7 +257,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 +277,13 @@ 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

cmd = (
f"--ioengine={ioengine} --filename={filename} "
f"--ioengine={ioengine.value} --filename={filename} "
LiliDeng marked this conversation as resolved.
Show resolved Hide resolved
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.LIBAIO,
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
27 changes: 24 additions & 3 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,11 +25,12 @@
""",
)
class NvmePerformace(TestSuite):
TIME_OUT = 5000
TIME_OUT = 7200

@TestCaseMetadata(
description="""
This test case uses fio to test NVMe disk performance.
This test case uses fio to test NVMe disk performance
using 'libaio' as ioengine
""",
priority=3,
timeout=TIME_OUT,
Expand All @@ -37,6 +39,25 @@ class NvmePerformace(TestSuite):
),
)
def perf_nvme(self, node: Node, result: TestResult) -> None:
self._perf_nvme(node, IoEngine.LIBAIO, result)
squirrelsc marked this conversation as resolved.
Show resolved Hide resolved

@TestCaseMetadata(
description="""
This test case uses fio to test NVMe disk performance
using 'io_uring' as ioengine.
""",
priority=3,
timeout=TIME_OUT,
requirement=simple_requirement(
supported_features=[Nvme],
),
)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for perf_nvme, it has requirement for count of nvme disks, for perf_nvme_io_uring, by default it uses 1 nvme disk, is it expected?

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]
SRIKKANTH marked this conversation as resolved.
Show resolved Hide resolved
nvme_namespaces = nvme.get_raw_nvme_disks()
disk_count = len(nvme_namespaces)
Expand All @@ -59,7 +80,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 +91,5 @@ def perf_nvme(self, node: Node, result: TestResult) -> None:
disk_setup_type=DiskSetupType.raw,
disk_type=DiskType.nvme,
test_result=result,
ioengine=ioengine,
)
Loading