| fio(1) | General Commands Manual | fio(1) |
نام (NAME)
fio - ابزار انعطافپذیر سنجش و آزمون ورودی/خروجی (I/O)
خلاصه دستور (SYNOPSIS)
fio [options] [jobfile]...
توضیحات (DESCRIPTION)
fio ابزاری است که تعدادی ریسه (thread) یا فرایند را برای اجرای نوع خاصی از عملیات I/O طبق مشخصات ارائهشده از سوی کاربر ایجاد میکند. استفادهٔ معمول از fio، نوشتن یک فایل وظیفه (jobfile) متناسب با بار کاری ورودی/خروجی مورد نظر برای شبیهسازی است.
گزینهها (OPTIONS)
- --debug=type
- ردیابی تفصیلی type را برای اقدامات گوناگون fio فعال میکند. میتواند مقدار “all” برای همهٔ typeها یا نوعهای مجزا که با ویرگول از هم جدا شدهاند باشد (برای نمونه “--debug=file,mem” اشکالزدایی مربوط به فایل و حافظه را فعال میکند). مقدار “help” همهٔ گزینههای ردیابی موجود را فهرست میکند.
- --parse-only
- تنها گزینهها را تجزیه میکند و هیچ عملیات I/O را آغاز نمیکند.
- --merge-blktrace-only
- تنها blktraceها را ادغام میکند و هیچ عملیات I/O را آغاز نمیکند.
- --output=filename
- خروجی را در filename مینویسد.
- --output-format=format
- قالب گزارشدهی (format) را روی “normal”، “terse”، “json” یا “json+” تنظیم میکند. چندین قالب را میتوان با جدا کردن توسط ویرگول انتخاب کرد. قالب “terse” قالبی مبتنی بر CSV است. “json+” شبیه “json” است، با این تفاوت که تخلیهٔ کامل (dump) دستههای تاخیر (latency buckets) را اضافه میکند.
- --bandwidth-log
- گزارشهای پهنای باند تجمیعی را تولید میکند. آرگومان `filename` اختیاری است. اگر مشخص نشود، Fio بهطور پیشفرض فایلهایی با نام “agg-{read,write,trim}_bw.log” ایجاد خواهد کرد. اگر آرگومان filename داده شود، Fio فایلهایی با نام “{filename}-{read,write,trim}_bw.log” ایجاد خواهد کرد.
- --minimal
- آمار را در قالبی مختصر و جداشده با نقطهویرگول چاپ میکند.
- --append-terse
- آمار را در حالت انتخابشده و همچنین در قالب مختصر و جداشده با نقطهویرگول چاپ میکند. منسوخ شده، به جای آن از --output-format برای انتخاب چند قالب استفاده کنید.
- --terse-version=version
- نسخهٔ قالب خروجی مختصر (version) را تنظیم میکند (پیشفرض “3”، یا “2”، “4”، “5”).
- --version
- اطلاعات نسخه را چاپ کرده و خارج میشود.
- --help
- خلاصهای از گزینههای خط فرمان را چاپ کرده و خارج میشود.
- --cpuclock-test
- آزمایش و اعتبارسنجی ساعت داخلی CPU را انجام میدهد.
- --crctest=[test]
- سرعت توابع درونی محاسبهٔ چکسام (checksum) را آزمایش میکند. اگر هیچ آرگومانی داده نشود، همهٔ آنها آزمایش میشوند. در غیر این صورت، میتوان فهرستی جداشده با ویرگول را ارسال کرد که در این حالت تنها موارد ارائهشده آزمایش میشوند.
- --cmdhelp=command
- اطلاعات راهنما را برای command چاپ میکند. میتواند “all” برای همهٔ دستورها باشد.
- --enghelp=[ioengine[,command]]
- همهٔ دستورهای تعریفشده توسط ioengine را فهرست میکند، یا راهنمای command تعریفشده توسط ioengine را چاپ میکند. اگر هیچ ioengine مشخص نشود، تمام موتورهای I/O موجود را فهرست میکند.
- --showcmd
- فایلهای jobfile دادهشده را به مجموعهای از گزینههای خط فرمان تبدیل میکند.
- --readonly
- بررسیهای ایمنی فقطخواندنی را فعال میکند و مانع از عملیات نوشتن و trim میشود. گزینهٔ --readonly یک محافظ ایمنی اضافی است تا از شروع تصادفی یک بار کاری نوشتن یا trim در زمانی که مطلوب نیست جلوگیری کند. Fio تنها در صورتی دستگاه تحت آزمایش را تغییر میدهد که “rw=write/randwrite/rw/randrw/trim/randtrim/trimwrite” مشخص شده باشد. از این شبکهٔ ایمنی میتوان به عنوان یک اقدام احتیاطی مضاعف استفاده کرد.
- --eta=when
- مشخص میکند چه زمانی تخمین بلادرنگ زمان تقریبی اتمام (ETA) باید چاپ شود. when میتواند یکی از مقادیر “always”، “never” یا “auto” باشد. حالت “auto” پیشفرض است و اگر خروجی یک TTY باشد، هنگام درخواست، ETA را چاپ میکند. حالت “always” بدون توجه به نوع خروجی، هنگام درخواست ETA را چاپ میکند. حالت “never” هرگز ETA را چاپ نمیکند.
- --eta-interval=time
- بهطور پیشفرض، fio وضعیت ETA کارخواه را تقریباً در هر ثانیه درخواست میکند. با این گزینه، این فاصلهٔ زمانی قابل تنظیم است. Fio برای جلوگیری از پر شدن بیش از حد کنسول، حداقل زمان مجازی را اعمال میکند؛ کمتر از ۲۵۰ میلیثانیه پشتیبانی نمیشود.
- --eta-newline=time
- پس از سپری شدن هر دورهٔ زمانی time، رفتن به سطر جدید را اجباری میکند. هنگامی که واحد زمان ذکر نشود، مقدار بر حسب ثانیه تفسیر میشود.
- --status-interval=time
- تخلیهٔ کامل وضعیت مقادیر تجمعی (از آغاز وظیفه) را در فواصل زمانی time اجباری میکند. این گزینه اندازهگیریهای مبتنی بر هر دوره را ارائه *نمیدهد*. بنابراین مقادیری چون پهنای باند، میانگینهای متحرک هستند. هنگامی که واحد زمان ذکر نشود، time بر حسب ثانیه تفسیر میشود. توجه داشته باشید که استفاده از این گزینه به همراه `--output-format=json` خروجیای تولید میکند که از نظر فنی JSON معتبری نیست، زیرا خروجی مجموعههایی تطبیقیافته از JSON معتبر خواهد بود. لازم است پس از اجرا، به مجموعههای معتبری از JSON تفکیک شود.
- --section=name
- تنها بخش name مشخصشده را در فایل وظیفه اجرا میکند. چند بخش را میتوان تعیین کرد. گزینهٔ --section امکان ترکیب وظایف مرتبط را در یک فایل فراهم میکند. برای نمونه، یک jobfile میتواند بخشهای سبک (light)، متوسط (moderate) و سنگین (heavy) را تعریف کند. با دادن گزینهٔ خط فرمان `--section=heavy` به fio میگویید که تنها بخش "heavy" را اجرا کند. همچنین میتوان عملیات "write" را در یک بخش و عملیات "verify" را در بخشی دیگر مشخص کرد. گزینهٔ --section تنها برای بخشهای وظیفه اعمال میشود. بخش رزروشدهٔ *global* همیشه تجزیه و استفاده میشود.
- --alloc-size=kb
- استخرهای حافظهٔ داخلی اضافی smalloc را با اندازهٔ kb بر حسب KiB تخصیص میدهد. گزینهٔ --alloc-size حافظهٔ اشتراکی کنار گذاشتهشده برای استفاده توسط fio را افزایش میدهد. اگر وظایف بزرگی با فعال بودن randommap اجرا شوند، ممکن است حافظهٔ fio تمام شود. Smalloc یک تخصیصدهندهٔ داخلی برای ساختارهای اشتراکی از یک استخر حافظه با اندازهٔ ثابت است و میتواند تا ۱۶ استخر رشد کند. اندازهٔ پیشفرض استخر 16MiB است. نکته: در حین اجرا، فایلهای پشتیبان `.fio_smalloc.*` در `/tmp` قابل مشاهده هستند.
- --warnings-fatal
- تمام هشدارهای تجزیهکنندهٔ fio مهلک در نظر گرفته میشوند و باعث میشوند fio با خطا خارج شود.
- --max-jobs=nr
- حداکثر تعداد ریسهها/فرایندهای قابل پشتیبانی را روی nr تنظیم میکند. نکته: در لینوکس، اگر fio در حین ایجاد وظایف با خطا مواجه شود، ممکن است نیاز به افزایش حد حافظهٔ اشتراکی (`/proc/sys/kernel/shmmax`) باشد.
- --server=args
- یک کارساز (server) پسزمینه را راهاندازی میکند که در آن args مشخص میکند روی چه چیزی شنود شود. بخش CLIENT/SERVER را ببینید.
- --daemonize=pidfile
- کارساز fio را در پسزمینه اجرا کرده و pid را در فایل pidfile مشخصشده مینویسد.
- --client=hostname
- به جای اجرای محلی وظایف، آنها را به hostname یا مجموعهای از hostnameهای مشخصشده فرستاده و اجرا میکند. بخش CLIENT/SERVER را ببینید.
- --remote-config=file
- به کارساز fio اعلام میکند که این file محلی را بارگذاری کند.
- --idle-prof=option
- بیکاری CPU را گزارش میدهد. option یکی از موارد زیر است:
- --inflate-log=log
- فایل گزارش فشردهشدهٔ log را از حالت فشرده خارج کرده و خروجی میدهد.
- --trigger-file=file
- هنگام وجود داشتن file، دستور راهانداز (trigger) را اجرا میکند.
- --trigger-timeout=time
- راهانداز را در این زمان (time) اجرا میکند.
- --trigger=command
- این command را به عنوان راهانداز محلی تنظیم میکند.
- --trigger-remote=command
- این command را به عنوان راهانداز دوردست تنظیم میکند.
- --aux-path=path
- به جای
دایرکتوری
کاری جاری،
از
دایرکتوری
مشخصشده
توسط path
برای
فایلهای
وضعیت
تولیدشده
استفاده
میکند..SH
"قالب فایل
کار (JOB FILE FORMAT)" هر
پارامتری
پس از
گزینهها
به عنوان
فایل کار در
نظر گرفته
خواهد شد،
مگر اینکه
با یک
پارامتر
فایل کار
مطابقت
داشته باشد.
میتوان
چندین فایل
کار را مشخص
کرد و هر
فایل کار به
عنوان یک
گروه مجزا
در نظر
گرفته
خواهد شد. Fio
اجرای بین
هر گروه را
stonewall (سدبندی)
خواهد کرد.
Fio یک یا چند فایل کار را میپذیرد که وظایف آن را توصیف میکنند. قالب فایل کار، یک فایل ini کلاسیک است که در آن نامهای محصور در براکتهای []، نام کار را تعریف میکنند. شما در استفاده از هر نام ASCII دلخواه آزاد هستید، به جز *global* که معنای ویژهای دارد. پس از نام کار، دنبالهای از صفر یا چند پارامتر، هر کدام در یک خط، میآیند که رفتار کار را مشخص میکنند. اگر اولین نویسه در یک خط ';' یا '#' باشد، کل خط به عنوان توضیح نادیده گرفته میشود.
یک بخش *global* پیشفرضهایی را برای کارهای توصیفشده در آن فایل تنظیم میکند. یک کار میتواند پارامتر یک بخش *global* را بازنویسی کند، و یک فایل کار در صورت نیاز حتی میتواند چندین بخش *global* داشته باشد. هر کار تنها تحت تأثیر بخش *global* قرار میگیرد که بالاتر از آن قرار دارد.
گزینهٔ --cmdhelp نیز تمام گزینهها را فهرست میکند. در صورت استفاده با یک آرگومان command، گزینهٔ --cmdhelp جزئیات command دادهشده را شرح میدهد.
برای الگوبرداری در مورد نحوهٔ نوشتن فایلهای کار، به دایرکتوری `examples/' مراجعه کنید. توجه داشته باشید که الزامات کپیرایت و مجوز در حال حاضر برای فایلهای `examples/' اعمال میشوند.
توجه داشته باشید که حداکثر طول یک خط در فایل کار ۸۱۹۲ بایت است.
پارامترهای فایل کار (JOB FILE PARAMETERS)
برخی پارامترها گزینهای از نوعی مشخص، مانند یک عدد صحیح یا یک رشته را میپذیرند. در هر جایی که مقدار عددی لازم باشد، میتوان از یک عبارت حسابی استفاده کرد، به شرطی که در پرانتز قرار گیرد. عملگرهای پشتیبانیشده عبارتند از:
جمع (+)
تفریق (-)
ضرب (*)
تقسیم (/)
باقیمانده (%)
توان (^)
برای مقادیر زمانی در عبارتها، واحدها به طور پیشفرض میکروثانیه هستند. این با مقادیر زمانی خارج از عبارتها (محصور نشده در پرانتز) متفاوت است.
انواع پارامترها (PARAMETER TYPES)
انواع پارامترهای زیر استفاده میشوند:
- str
- رشته. دنبالهای از نویسههای حرفی-عددی.
- time
- عدد صحیح با پسوند زمانی ممکن. در صورت نبود واحد، مقدار به عنوان ثانیه تفسیر میشود مگر اینکه خلاف آن مشخص شده باشد. پسوندهای 'd' برای روز، 'h' برای ساعت، (یا 'usec') برای میکروثانیه را میپذیرد. برای مثال، از 10m برای ۱۰ دقیقه استفاده کنید.
- int
- عدد صحیح. یک مقدار عدد کامل که میتواند شامل یک پیشوند عدد صحیح و یک پسوند عدد صحیح باشد.
[*integer prefix*] **number** [*integer suffix*]
پیشوند اختیاری *integer prefix* مبنای عدد را مشخص میکند. پیشفرض دهدهی (decimal) است. *0x* مبنای شانزدهشانزدهی (hexadecimal) را مشخص میکند.
پسوند اختیاری *integer suffix* واحدهای عدد را مشخص میکند و شامل یک پیشوند واحد اختیاری و یک واحد اختیاری است. برای مقادیر داده، واحد پیشفرض بایت است. برای مقادیر زمان، واحد پیشفرض ثانیه است مگر اینکه خلاف آن مشخص شده باشد.
با `kb_base=1000'، fio از استانداردهای بینالمللی برای پیشوندهای واحد پیروی میکند. برای تعیین مقادیر دهدهی توان ۱۰ تعریفشده در سامانهٔ بینالمللی یکactorها (SI):
K به معنای کیلو (K) یا 1000
M به معنای مگا (M) یا 1000**2
G به معنای گیگا (G) یا 1000**3
T به معنای ترا (T) یا 1000**4
P به معنای پتا (P) یا 1000**5
برای تعیین مقادیر دودویی توان ۲ تعریفشده در IEC 80000-13:
Ki به معنای کیبی (Ki) یا 1024
Mi به معنای مبی (Mi) یا 1024**2
Gi به معنای گیبی (Gi) یا 1024**3
Ti به معنای تبی (Ti) یا 1024**4
Pi به معنای پبی (Pi) یا 1024**5
برای حالت دستگاه بلوکی ناحیهای (Zone Block Device Mode):
z به معنای Zone (ناحیه)
با `kb_base=1024' (پیشفرض)، پیشوندهای واحد برعکس پیشوندهای تعیینشده در استانداردهای SI و IEC 80000-13 هستند تا سازگاری با اسکریپتهای قدیمی فراهم شود. برای مثال، 4k به معنای 4096 است.
برای مقادیر داده، میتوان یک واحد اختیاری 'B' را نیز گنجاند (مثلاً 'kB' همانند 'k' است).
پسوند *integer suffix* به بزرگی و کوچکی حروف حساس نیست (مثلاً m/mi به معنای mebi/mega است، نه milli). هم 'b' و هم 'B' به معنای بایت هستند، نه بیت.
مثالها با `kb_base=1000':
4 KiB: 4096, 4096b, 4096B, 4k, 4kb, 4kB, 4K, 4KB
1 MiB: 1048576, 1m, 1024k
1 MB: 1000000, 1mi, 1000ki
1 TiB: 1073741824, 1t, 1024m, 1048576k
1 TB: 1000000000, 1ti, 1000mi, 1000000ki
مثالها با `kb_base=1024' (پیشفرض):
4 KiB: 4096, 4096b, 4096B, 4k, 4kb, 4kB, 4K, 4KB
1 MiB: 1048576, 1m, 1024k
1 MB: 1000000, 1mi, 1000ki
1 TiB: 1073741824, 1t, 1024m, 1048576k
1 TB: 1000000000, 1ti, 1000mi, 1000000ki
برای تعیین زمانها (واحدها به بزرگی و کوچکی حروف حساس نیستند):
D به معنای روز (days)
H به معنای ساعت (hours)
M به معنای دقیقه (minutes)
s یا sec به معنای ثانیه (پیشفرض)
ms یا msec به معنای میلیثانیه
us یا usec به معنای میکروثانیه
پسوند `z' مشخص میکند که مقدار بر حسب ناحیهها (zones) اندازهگیری میشود. به محض مشخص شدن اندازهٔ ناحیهٔ دستگاه بلوکی، مقدار مجدداً محاسبه میشود.
اگر گزینه یک محدودهٔ بالا و پایین را بپذیرد، از دونقطه ':' یا خط پیوند '-' برای جداسازی این مقادیر استفاده کنید. نوع پارامتر irange را ببینید. اگر مقدار پایینی تعیینشده تصادفاً بزرگتر از مقدار بالایی باشد، این دو مقدار جابهجا میشوند.
- bool
- بولی (Boolean). معمولاً به عنوان یک عدد صحیح پردازش میشود، اما تنها برای درست و نادرست (1 و 0) تعریف شده است.
- irange
- محدودهٔ عدد صحیح با پسوند. امکان تعیین یک محدوده از مقادیر را فراهم میکند، مانند 1024-4096. همچنین میتوان از دونقطه به عنوان جداکننده استفاده کرد، مانند 1k:4k. اگر گزینه دو مجموعه محدوده را بپذیرد، میتوان آنها را با جداکنندهٔ
- float_list
- فهرستی از اعداد ممیز شناور، که با نویسهٔ ':' از هم جدا شدهاند..SH "پارامترهای کار (JOB PARAMETERS)" با در نظر گرفتن موارد بالا، در ادامه فهرست کامل پارامترهای کار fio آورده شده است.
واحدها (Units)
- kb_base=int
- انتخاب نحوه تفسیر پیشوندهای واحد در پارامترهای ورودی.
- 1000
- ورودیها با IEC 80000-13 و سامانه استاندارد بینالمللی یکاها (SI) مطابقت دارند. استفاده کنید از:
- مقادیر توان ۲ با پیشوندهای IEC (مانند KiB)
- مقادیر توان ۱۰ با پیشوندهای SI (مانند kB)
- 1024
- حالت سازگاری (پیشفرض). برای جلوگیری از کارافتادن اسکریپتهای قدیمی:
- مقادیر توان ۱۰ با پیشوندهای IEC
برای جزئیات بیشتر درباره پارامترهای ورودی، bs را ببینید.
خروجیها همواره از پیشوندهای صحیح استفاده میکنند. اکثر خروجیها شامل هر دو در کنار یکدیگر هستند، مانند:
اگر تنها یک مقدار گزارش شود، آنگاه kb_base انتخاب میکند کدامیک استفاده شود:
1024 -- پیشوندهای IEC
- unit_base=int
- واحد پایه برای گزارشدهی. مقادیر مجاز عبارتند از:
- 0
- استفاده از تشخیص خودکار (پیشفرض).
- 8
- بر پایه بایت.
- 1
- بر پایه بیت.
شرح کار (Job description)
- name=str
- نام ASCII کار. این پارامتر میتواند برای جایگزین کردن نام چاپشده توسط fio برای این کار استفاده شود. در غیر این صورت از نام کار استفاده خواهد شد. در خط فرمان، این پارامتر کاربرد ویژهای نیز دارد که نشاندهنده آغاز یک کار جدید است.
- description=str
- شرح متنی کار. کاری انجام نمیدهد جز اینکه هنگام اجرای این کار، این شرح متنی را نمایش میدهد. این متن تجزیه نمیشود.
- loops=int
- اجرای تعداد دفعات تکرار مشخصشده از این کار. برای تکرار همان بار کاری به تعداد دفعات معین استفاده میشود. پیشفرض 1 است.
- numjobs=int
- ایجاد تعداد همسانهای (clone) مشخصشده از این کار. هر همسان از کار به صورت یک ریسه یا فرایند مستقل ایجاد میشود. میتواند برای راهاندازی تعداد بیشتری از ریسهها/فرایندهایی که کار یکسانی را انجام میدهند استفاده شود. هر ریسه بهطور جداگانه گزارش میشود؛ برای دیدن آمار تمام همسانها به صورت یکجا، از group_reporting همراه با new_group استفاده کنید. --max-jobs را ببینید. پیشفرض: 1.
پارامترهای مرتبط با زمان (Time related parameters)
- runtime=time
- محدود کردن زمان اجرا. آزمایش تا زمانی اجرا میشود که بار کاری I/O پیکربندیشده کامل شود یا به این مدت زمان مشخصشده اجرا شده باشد؛ هر کدام که زودتر رخ دهد. تعیین مدت زمان اجرای یک کار مشخص میتواند بسیار دشوار باشد، بنابراین این پارامتر برای محدود کردن کل زمان اجرا به یک زمان معین کارآمد است. در صورت حذف واحد، مقدار بر حسب ثانیه تفسیر میشود.
- time_based
- در صورت تنظیم، fio برای کل مدت زمان مشخصشده در runtime اجرا خواهد شد، حتی اگر فایل(ها) به طور کامل خوانده یا نوشته شده باشند. این گزینه تا جایی که runtime اجازه دهد، همان بار کاری را تکرار میکند.
- startdelay=irange(int)
- به تأخیر انداختن شروع کار به مدت زمان مشخصشده. میتواند یک مقدار منفرد یا یک محدوده باشد. در صورت مشخص شدن به عنوان یک محدوده، هر ریسه مقداری را به صورت تصادفی از درون محدوده انتخاب میکند. اگر واحد حذف شود، مقدار بر حسب ثانیه است.
- ramp_time=time
- در صورت تنظیم، fio قبل از ثبت هرگونه آمار کارایی، بار کاری مشخصشده را برای این مدت زمان اجرا میکند. برای تثبیت کارایی پیش از ثبت نتایج مفید است و در نتیجه زمان اجرای لازم برای دستیابی به نتایج پایدار را به حداقل میرساند. توجه داشته باشید که ramp_time به عنوان زمان گرمکردن اولیه کار در نظر گرفته میشود، بنابراین در صورتی که یک مهلت زمانی خاص یا runtime مشخص شده باشد، کل زمان اجرا را افزایش میدهد. در صورت حذف واحد، مقدار بر حسب ثانیه است.
- ramp_size=size
- در صورت تنظیم، fio تا زمانی که کار میزان معینی I/O انجام دهد، پیش از ثبت هرگونه آمار کارایی منتظر میماند. هنگامی که group_reporting فعال باشد، ثبت زمانی آغاز میشود که تمام کارهای موجود در گروه با یکدیگر میزان معین I/O را انجام دهند. مشابه با ramp_time، این گزینه برای تثبیت کارایی پیش از ثبت نتایج مفید است و در صورتی که مهلت زمانی خاص یا runtime مشخص شده باشد، کل زمان اجرا را افزایش میدهد. در صورت حذف واحد، مقدار بر حسب بایت است.
- clocksource=str
- استفاده از منبع ساعت (clocksource) دادهشده به عنوان پایه زمانسنجی. گزینههای پشتیبانیشده عبارتند از:
- gettimeofday
- gettimeofday(2)
- clock_gettime
- clock_gettime(2)
- cpu
- منبع ساعت داخلی پردازنده (CPU)
در صورت قابل اعتماد بودن، cpu منبع ساعت ترجیحی است، زیرا بسیار سریع است (و fio فراخوانیهای زمانی متعددی دارد). Fio در صورتی که این منبع ساعت پشتیبانی شود و روی سامانهای که در حال اجرا است قابل اعتماد در نظر گرفته شود، به طور خودکار از آن استفاده خواهد کرد، مگر اینکه منبع ساعت دیگری به طور مشخص تنظیم شده باشد. برای پردازندههای x86/x86-64، این به معنای پشتیبانی از TSC Invariant است.
- gtod_reduce=bool
- فعالسازی تمام گزینههای کاهنده فراخوانیهای gettimeofday(2) (disable_clat، disable_slat، disable_bw_measurement) به همراه کاهش اندک دقت مهلت زمانی (timeout) برای کاهش چشمگیر تعداد فراخوانیهای gettimeofday(2). با فعال بودن این گزینه، تنها حدود 0.4% از فراخوانیهای gettimeofday(2) در مقایسه با زمانی که تمام زمانسنجیها فعال باشند انجام میشود.
- gtod_cpu=int
- گاهی اختصاص یک ریسه اجرایی مجزا تنها برای دریافت زمان جاری مقرونبهصرفهتر است. Fio (و برای مثال پایگاههای داده) استفاده بسیار فشردهای از فراخوانیهای gettimeofday(2) دارند. با این گزینه، میتوانید یک پردازنده (CPU) را کنار بگذارید تا کاری جز ثبت زمان جاری در یک مکان حافظه مشترک انجام ندهد. سپس سایر ریسهها/فرایندهایی که بارهای کاری I/O را اجرا میکنند تنها نیاز به رونوشت از آن قطعه دارند، به جای اینکه با فراخوانی gettimeofday(2) وارد هسته سیستمعامل شوند. پردازندهای که برای انجام این فراخوانیهای زمانی کنار گذاشته شده است از سایر کاربردها مستثنی خواهد شد. Fio آن را به صورت دستی از ماسک CPU سایر کارها حذف میکند.
- job_start_clock_id=int
- شناسه clock_id ارائهشده به فراخوانی clock_gettime که برای ثبت job_start در قالب خروجی json استفاده میشود. مقدار پیشفرض 0 یا CLOCK_REALTIME است..SS "فایل/دستگاه هدف (Target file/device)"
- directory=str
- این دایرکتوری را به عنوان پیشوند به filenameها اضافه میکند. برای قرار دادن فایلها در مکانی به جز `./' به کار میرود. میتوانید با جدا کردن نامها توسط نویسهٔ ':'، چندین دایرکتوری مشخص کنید. این دایرکتوریها تا زمانی که از نامفایلهای تولیدشده استفاده شود، به طور مساوی بین همزادهای کاری (job clones) ایجاد شده توسط numjobs توزیع خواهند شد. اگر filename(های) خاصی تعیین شده باشد، fio از نخستین دایرکتوری فهرستشده استفاده میکند و در نتیجه با معناشناسی filename مطابقت خواهد داشت (که در صورت عدم تعیین، برای هر همزاد یک فایل تولید میکند، اما در صورت تنظیم، به همهٔ همزادها اجازه میدهد از یک فایل مشترک استفاده کنند).
برای اطلاعات دربارهٔ نحوهٔ گریز (escape) دادن نویسههای ':' در خود مسیر دایرکتوری، گزینهٔ filename را ببینید.
نکته: برای کنترل دایرکتوریای که fio برای فایلهای وضعیت داخلی استفاده میکند، از --aux-path استفاده کنید.
- filename=str
- معمولاً fio یک filename را بر اساس نام کار، شمارهٔ رشته (thread) و شمارهٔ فایل میسازد (گزینهٔ filename_format را ببینید). اگر میخواهید فایلها را بین رشتههای یک کار یا چندین کار با مسیرهای فایل ثابت به اشتراک بگذارید، برای هر یک از آنها یک filename تعیین کنید تا مقدار پیشفرض بازنویسی شود. اگر ioengine مبتنی بر فایل باشد، میتوانید با جدا کردن نامها توسط دونقطهٔ ':'، چندین فایل را مشخص کنید. بنابراین اگر میخواستید کاری دو فایل `/dev/sda' و `/dev/sdb' را به عنوان دو فایل کاری باز کند، از `filename=/dev/sda:/dev/sdb' استفاده میکردید. این همچنین بدان معناست که هرگاه این گزینه مشخص شود، nrfiles نادیده گرفته میشود. اندازهٔ فایلهای عادی تعیینشده توسط این گزینه برابر با size تقسیم بر تعداد فایلها خواهد بود، مگر اینکه اندازهٔ صریحی توسط filesize مشخص شده باشد.
هر دونقطه در مسیر مورد نظر باید با یک نویسهٔ '\' گریز داده شود. برای مثال، اگر مسیر `/dev/dsk/foo@3,0:c' باشد، باید از `filename=/dev/dsk/foo@3,0\:c' استفاده کنید و اگر مسیر `F:\filename' باشد، باید از `filename=F\:\filename' استفاده کنید.
در Windows، دستگاههای دیسک برای اولین دستگاه به صورت `\\.\PhysicalDrive0'، برای دستگاه دوم به صورت `\\.\PhysicalDrive1' و به همین ترتیب در دسترس هستند. نکته: Windows و FreeBSD از دسترسی نوشتن به بخشهایی از دیسک که حاوی دادههای در حال استفاده هستند (مانند سیستمهای فایل) جلوگیری میکنند.
برای دسترسی HTTP و S3، به ترتیب یک مسیر URL معتبر یا کلید S3 مشخص کنید. نامفایل برای S3 به سبک path-style شامل نام باکت است (`/bucket/k/e.y') در حالی که نامفایل S3 به سبک virtual-hosted-style (`/k/e.y') شامل آن نیست، زیرا نام باکت آن در http_host تعیین میشود.
نامفایل `-' یک نام رزرو شده به معنای *stdin* یا *stdout* است. اینکه کدام یک از این دو باشد، به جهت خواندن/نوشتن تنظیمشده بستگی دارد.
- filename_format=str
- در صورت اشتراکگذاری چندین فایل بین کارها، معمولاً لازم است fio نامهای دقیق مد نظر شما را تولید کند. به طور پیشفرض، fio فایل را بر اساس مشخصهٔ قالب پیشفرض یعنی `jobname.jobnumber.filenumber' نامگذاری میکند. با این گزینه، این الگو قابل سفارشیسازی است. Fio کلیدواژههای زیر را در این رشته شناسایی و جایگزین میکند:
- $jobname
- نام رشته یا فرآیند کارگر (worker).
- $clientuid
- آدرس IP فرآیند fio هنگام استفاده از حالت client/server.
- $jobnum
- شمارهٔ افزایشی رشته یا فرآیند کارگر.
- $filenum
- شمارهٔ افزایشی فایل برای آن رشته یا فرآیند کارگر.
برای اینکه کارهای وابسته مجموعهای از فایلها را به اشتراک بگذارند، این گزینه میتواند طوری تنظیم شود که fio نامفایلهایی تولید کند که بین آن دو مشترک باشد. برای مثال، اگر `testfiles.$filenum' تعیین شود، فایل شمارهٔ ۴ برای هر کاری به نام `testfiles.4' نامگذاری خواهد شد. اگر مشخصکنندهٔ قالب دیگری ارائه نشود، مقدار پیشفرض `$jobname.$jobnum.$filenum' استفاده خواهد شد.
اگر مسیری را مشخص کنید، دایرکتوریها تا دایرکتوری اصلی فایل ایجاد خواهند شد. بنابراین برای نمونه اگر `a/b/c/$jobnum` را مشخص کنید، دایرکتوریهای a/b/c پیش از مرحلهٔ برپایی فایل در کار ایجاد میشوند. اگر directory را تعیین کنید، مسیر نسبت به آن دایرکتوری نسبی خواهد بود، در غیر این صورت به عنوان یک مسیر مطلق در نظر گرفته میشود.
- unique_filename=bool
- برای جلوگیری از تداخل میان کلاینتهای شبکهای، fio به طور پیشفرض مبدا کلاینت متصلشونده را به عنوان پیشوند به هر نامفایل تولیدشده (با دایرکتوری مشخصشده) اضافه میکند. برای غیرفعال کردن این رفتار، این گزینه را روی 0 تنظیم کنید.
- filetype=str
- فرض را بر این میگذارد که تمام فایلهای تعریفشده در یک کار از این نوع هستند. به طور پیشفرض fio برای هر فایل یک فراخوانی stat(2) انجام میدهد تا نوع فایل آن را متوجه شود. برای مجموعهفایلهای عظیم این عمل ممکن است یک گلوگاه باشد، بنابراین از این گزینه میتوان برای صرفنظر کردن از تعداد انبوه فراخوانیهای سیستمی استفاده کرد. انواع فایل عبارتند از:
- opendir=str
- به صورت بازگشتی هر فایلی را در زیر دایرکتوری str باز میکند. این گزینه تنها یک دایرکتوری منفرد را میپذیرد و بر خلاف گزینههای مرتبط، دونقطههای موجود در مسیر نباید گریز داده شوند.
- lockfile=str
- fio به طور پیشفرض پیش از انجام I/O روی فایلها، آنها را قفل نمیکند. اگر یک فایل یا توصیفگر فایل مشترک باشد، fio میتواند I/O به آن فایل را پیاپی (سریالایز) کند تا نتیجهٔ نهایی سازگار باشد. این عمل برای شبیهسازی بارهای کاری واقعی که فایلها را به اشتراک میگذارند معمول است. حالتهای قفل عبارتند از:
- nrfiles=int
- تعداد فایلهای مورد استفاده برای این کار. مقدار پیشفرض 1 است. اندازهٔ فایلها برابر با size تقسیم بر این تعداد خواهد بود، مگر اینکه اندازهٔ صریحی توسط filesize تعیین شده باشد. فایلها برای هر رشته به صورت جداگانه ایجاد میشوند و همانطور که در بخش filename توضیح داده شد، هر فایل به طور پیشفرض شمارهٔ فایلی درون نام خود خواهد داشت.
- openfiles=int
- تعداد فایلهایی که به طور همزمان باز نگه داشته میشوند. پیشفرض آن مشابه با nrfiles است؛ میتواند برای محدود کردن تعداد فایلهای باز همزمان، روی مقدار کمتری تنظیم شود.
- file_service_type=str
- تعیین میکند fio چگونه تصمیم بگیرد که در مرحلهٔ بعد به کدام فایل از یک کار سرویسدهی کند. انواع زیر تعریف شدهاند:
- random
- انتخاب تصادفی یک فایل.
- roundrobin
- روش نوبتی (Round robin) روی فایلهای بازشده. این حالت پیشفرض است.
- sequential
- اتمام یک فایل پیش از رفتن به سراغ فایل بعدی. بسته به openfiles، همچنان چندین فایل میتوانند همزمان باز باشند.
- zipf
- استفاده از توزیع زیف (Zipf) برای تصمیمگیری دربارهٔ دسترسی به فایل.
- pareto
- استفاده از توزیع پارتو (Pareto) برای تصمیمگیری دربارهٔ دسترسی به فایل.
- normal
- استفاده از توزیع گاوسی (نرمال) برای تصمیمگیری دربارهٔ دسترسی به فایل.
- gauss
- نام مستعاری برای normal.
برای random، roundrobin، و sequential، میتوان یک پسوند اضافه کرد تا به fio بگوید پیش از جابجایی به یک فایل جدید، چه تعداد I/O صادر کند. برای مثال، تعیین `file_service_type=random:8' باعث میشود fio پیش از انتخاب تصادفی یک فایل جدید، ۸ عملیات I/O صادر کند. برای توزیعهای غیریکنواخت، میتوان یک پسوند ممیز شناور تعیین کرد تا بر میزان چولگی توزیع تأثیر بگذارد. برای توضیحات نحوهٔ کارکرد آن، random_distribution را ببینید.
- ioscheduler=str
- تلاش میکند پیش از اجرا، زمانبند ورودی/خروجی (I/O scheduler) دستگاه میزبان فایل را به مورد تعیینشده تغییر دهد. اگر فایل یک لوله (pipe) باشد، یا یک فایل دستگاه نویسهای باشد، یا در صورتی که دستگاه میزبان فایل قابل تشخیص نباشد، این گزینه نادیده گرفته میشود.
- create_serialize=bool
- در صورت مقدار true، ایجاد فایل را برای کارها به صورت ترتیبی (سریالایز) انجام میدهد. این امر ممکن است برای جلوگیری از درهمآمیختگی (interleaving) فایلهای داده کاربردی باشد، که میتواند به سیستم فایل مورد استفاده و حتی تعداد پردازندههای سیستم به شدت وابسته باشد. مقدار پیشفرض: true..TP create_fsync=bool اجرای fsync(2) روی فایل داده پس از ایجاد. این مقدار پیشفرض است.
- create_on_open=bool
- اگر true باشد، فایلها از قبل ایجاد نمیشوند، بلکه به فراخوانی open() کار اجازه داده میشود تا هنگام فرا رسیدن زمان I/O فایل را ایجاد کند. پیشفرض: false -- تمام فایلهای لازم هنگام شروع کار از قبل ایجاد میشوند.
- create_only=bool
- اگر true باشد، fio تنها فاز راهاندازی (setup) کار را اجرا خواهد کرد. اگر نیاز باشد فایلها روی دیسک چیده شده یا بهروزرسانی شوند، فقط همین کار انجام خواهد شد -- محتوای اصلی کار اجرا نمیشود. پیشفرض: false.
- allow_file_create=bool
- اگر true باشد، fio مجاز است به عنوان بخشی از بار کاری خود فایلها را ایجاد کند. اگر این گزینه false باشد، چنانچه فایلهای مورد نیاز از پیش وجود نداشته باشند fio با خطا متوقف خواهد شد. پیشفرض: true.
- allow_mounted_write=bool
- اگر این گزینه تنظیم نشود، fio کارهایی را که مخرب هستند (مانند عملیات نوشتن) روی دستگاهها یا پارتیشنهایی که به نظر میرسد متصل (mounted) هستند متوقف میکند. این کار به جلوگیری از ایجاد تصادفی آزمونهای مخرب کمک میکند، آزمونهایی که بدون درک اینکه دادهها در سامانه فایل متصل نابود خواهند شد اجرا میشوند. توجه داشته باشید که برخی پلتفرمها صرفنظر از این گزینه، اجازه نوشتن روی یک دستگاه متصل را نمیدهند. پیشفرض: false.
- pre_read=bool
- در صورت تعیین این گزینه، فایلها پیش از آغاز عملیات I/O مشخصشده، از قبل در حافظه خوانده میشوند. این کار همچنین پرچم invalidate را پاک میکند، چرا که خواندن از پیش و سپس دور انداختن کش بیمعنی است. این ویژگی تنها برای موتورهای I/O که دارای قابلیت تغییر مکان (seek-able) هستند کار میکند، زیرا به شما امکان میدهند دادههای یکسان را چندین بار بخوانید. بنابراین روی موتورهای I/O فاقد قابلیت تغییر مکان (مانند network و splice) کار نخواهد کرد. پیشفرض: false.
- unlink=bool
- حذف (unlink) فایلهای کار پس از پایان. این مقدار پیشفرض نیست، زیرا در صورت اجرای مکرر آن کار، زمان زیادی صرف بازتولید پیاپی مجموعه فایلها خواهد شد. پیشفرض: false.
- unlink_each_loop=bool
- حذف (unlink) فایلهای کار پس از هر تکرار یا حلقه. پیشفرض: false.
- zonemode=str
- مقادیر پذیرفتهشده عبارتند از:
- none
- پارامترهای zonerange، zonesize، zonecapacity و zoneskip نادیده گرفته میشوند.
- strided
- عملیات I/O در یک ناحیه (zone) واحد انجام میشود تا زمانی که به اندازه zonesize بایت منتقل شود. پس از انتقال این حجم از بایتها، پردازش ناحیه بعدی آغاز میشود. پارامتر zonecapacity نادیده گرفته میشود.
- zbd
- حالت دستگاه بلوکی ناحیهبندیشده (Zoned block device). عملیات I/O در هر ناحیه به صورت ترتیبی رخ میدهد، حتی اگر I/O تصادفی انتخاب شده باشد. I/O تصادفی به جای محدود شدن به یک ناحیه واحد، در سرتاسر همه ناحیهها اتفاق میافتد. پارامتر zoneskip نادیده گرفته میشود. مقادیر zonerange و zonesize باید یکسان باشند. اگر اندازه فضای ننوشتهشده در یک ناحیه در ابتدای بار کاری، مضربی از اندازه بلوک مشخصشده نباشد، بارهای کاری نوشتن نواحی باقیمانده ننوشتهشده در انتهای نواحی ایجاد میکنند و وضعیت نواحی را در حالت باز (open) نگه میدارند. برای آزاد کردن منابع نواحی باز، fio عملیات اتمام ناحیه (zone finish) را برای نواحی دارای باقیمانده صادر میکند. عملیات Trim با استفاده از عملیات بازنشانی ناحیه (zone reset) انجام میپذیرد. در Trim تنها نواحی غیرخالی از نوع sequential write required و sequential write preferred در نظر گرفته میشوند.
- zonerange=int
- برای zonemode=strided،
این
پارامتر
اندازه یک
ناحیه
منفرد را
مشخص
میکند.
همچنین
گزینههای
zonesize و zoneskip را
ببینید.
برای zonemode=zbd، این پارامتر نادیده گرفته میشود.
- zonesize=int
- برای zonemode=strided،
این مقدار
نشاندهنده
تعداد
بایتهایی
است که باید
پیش از رد
کردن (skip) zoneskip
بایت منتقل
شوند. اگر
این
پارامتر از
zonerange کوچکتر
باشد، تنها
به بخشی از
هر ناحیه با
اندازه zonerange
دسترسی
پیدا خواهد
شد. اگر این
پارامتر از
zonerange بزرگتر
باشد، پیش
از پرش به
ناحیه
بعدی، به هر
ناحیه
چندین بار
دسترسی
پیدا خواهد
شد.
برای zonemode=zbd، این اندازه یک ناحیه منفرد است. پارامتر zonerange در این حالت نادیده گرفته میشود. برای کاری که به یک دستگاه بلوکی ناحیهبندیشده دسترسی دارد، مقدار zonesize مشخصشده باید 0 یا برابر با اندازه ناحیه دستگاه باشد. برای یک دستگاه بلوکی معمولی یا یک فایل، zonesize مشخصشده باید حداقل 512B باشد.
- zonecapacity=int
- برای zonemode=zbd، این پارامتر ظرفیت یک ناحیه واحد را تعریف میکند، که محدوده در دسترس از آدرس شروع ناحیه است. این پارامتر فقط زمانی اعمال میشود که zonemode=zbd در ترکیب با دستگاههای بلوکی معمولی استفاده شود. در صورت عدم تعیین، مقدار پیشفرض آن اندازه ناحیه است. اگر دستگاه هدف یک دستگاه بلوکی ناحیهبندیشده باشد، ظرفیت ناحیه از اطلاعات دستگاه به دست میآید و این گزینه نادیده گرفته میشود.
- zoneskip=int[z]
- برای zonemode=strided،
تعداد
بایتهایی
است که باید
پس از
انتقال zonesize
بایت داده
نادیده
گرفته و رد
شوند.
برای zonemode=zbd، تعداد بایتهای همتراز با zonesize است که باید پس از پر شدن کامل یک ناحیه (بارهای کاری نوشتن) یا خوانده شدن تمام دادههای نوشتهشده در ناحیه (بارهای کاری خواندن) رد شوند. این پارامتر فقط برای بارهای کاری ترتیبی معتبر است و برای بارهای کاری تصادفی نادیده گرفته میشود. برای بارهای کاری خواندن، read_beyond_wp را نیز ببینید.
- read_beyond_wp=bool
- این
پارامتر
فقط برای
zonemode=zbd اعمال
میشود.
دستگاههای بلوکی ناحیهبندیشده، دستگاههای بلوکی هستند که از چندین ناحیه تشکیل شدهاند. هر ناحیه دارای یک نوع است، مانند conventional (سنتی) یا sequential (ترتیبی). یک ناحیه conventional میتواند در هر آفستی که مضربی از اندازه بلوک باشد نوشته شود. نواحی sequential باید به صورت ترتیبی نوشته شوند. موقعیتی که عمل نوشتن باید در آن رخ دهد «اشارهگر نوشتن» (write pointer) نامیده میشود. یک دستگاه بلوکی ناحیهبندیشده میتواند host managed یا host aware باشد. در دستگاههای host managed، میزبان باید اطمینان حاصل کند که نوشتنها به صورت ترتیبی انجام میشوند. ابزار fio دستگاههای host managed را شناسایی کرده و نوشتنها در نواحی ترتیبی را برای این دستگاهها به شکل متوالی و سریالی درمیآورد.
اگر در یک ناحیه ترتیبی، خواندن فراتر از اشارهگر نوشتن رخ دهد، دستگاه بلوکی ناحیهبندیشده عملیات خواندن را بدون خواندن هیچ دادهای از رسانه ذخیرهسازی تکمیل میکند. از آنجا که این نوع خواندنها منجر به مقادیر پهنای باند و IOPS به شکل غیرواقعی بالا میشوند، fio تنها در صورتی اقدام به خواندن فراتر از اشارهگر نوشتن میکند که صریحاً به آن دستور داده شده باشد. پیشفرض: false.
- max_open_zones=int
- هنگامی که
یک ناحیه از
دستگاه
بلوکی
ناحیهبندیشده
به صورت
جزئی نوشته
شده باشد
(یعنی همه
سکتورهای
ناحیه
نوشته نشده
باشند)،
ناحیه در
یکی از این
سه وضعیت
قرار
میگیرد: “implicit
open” (باز
ضمنی)، “explicit open”
(باز صریح)
یا “closed”
(بسته).
دستگاههای
بلوکی
ناحیهبندیشده
ممکن است
دارای
محدودیتی
به نام “max_open_zones”
(همنام با
این
پارامتر)
برای کل
تعداد
نواحی
باشند که
میتوانند
به طور
همزمان در
وضعیتهای
“implicit open” یا “explicit
open” قرار
گیرند.
همچنین
ممکن است
این
دستگاهها
دارای
محدودیت
دیگری به
نام “max_active_zones”
برای کل
تعداد
نواحی
باشند که
میتوانند
به طور
همزمان در
هر سه وضعیت
قرار گیرند.
پارامتر
max_open_zones تعداد
نواحی را که
دستورات
نوشتن برای
آنها توسط
همه کارهای
fio صادر
میشود
محدود
میکند،
یعنی تعداد
نواحی که در
این شرایط
قرار
خواهند
گرفت را
محدود
میسازد.
هنگامی که
دستگاه
دارای
محدودیت max_open_zones
بوده و فاقد
محدودیت max_active_zones
باشد،
پارامتر
max_open_zones تعداد
نواحی در دو
حالت باز را
تا سقف مجاز
محدود
میکند. در
این حالت، fio
در ابتدای
شروع به کار
خود نواحی
موجود در دو
وضعیت باز
را جزء
نواحی هدف
نوشتن قرار
میدهد.
هنگامی که
دستگاه هم
دارای
محدودیت max_open_zones
و هم max_active_zones
باشد،
پارامتر
max_open_zones تعداد
نواحی در هر
سه وضعیت را
تا سقف مجاز
محدود
مینماید.
در این
حالت، fio در
هنگام
شروع،
نواحی
موجود در
این سه
وضعیت را
جزء نواحی
هدف نوشتن
در نظر
میگیرد.
این پارامتر تنها در صورتی مرتبط است که از zonemode=zbd استفاده شود. مقدار پیشفرض همیشه برابر با محدودیت max_open_zones دستگاه بلوکی ناحیهبندیشده هدف است و مقداری بالاتر از این حد توسط کاربران قابل تعیین نیست مگر اینکه گزینه ignore_zone_limits مشخص شده باشد. هنگامی که ignore_zone_limits مشخص شده باشد یا دستگاه هدف فاقد محدودیت max_open_zones باشد، میتوان در max_open_zones مقدار 0 را تعیین کرد تا هرگونه محدودیت بر روی تعداد نواحی که میتوانند به طور همزمان توسط تمام کارها نوشته شوند، غیرفعال گردد.
- job_max_open_zones=int
- به همان شیوه max_open_zones، تعداد نواحی باز را به ازای هر کار fio محدود میکند، یعنی تعداد نواحی که یک کار منفرد میتواند به طور همزمان روی آنها بنویسد. مقدار صفر به معنی نبود محدودیت است. پیشفرض: صفر.
- ignore_zone_limits=bool
- اگر از این گزینه استفاده شود، fio محدودیت حداکثر تعداد نواحی باز در دستگاه بلوکی ناحیهبندیشده مورد استفاده را نادیده میگیرد و بدین ترتیب اجازه میدهد مقدار گزینه max_open_zones بزرگتر از حد گزارششده توسط دستگاه باشد. پیشفرض: false.
- zone_reset_threshold=float
- عددی بین صفر و یک که نشاندهنده نسبت بایتهای نوشتهشده در نواحی دارای اشارهگر نوشتن در محدوده IO به اندازه محدوده IO است. هنگامی که نسبت فعلی فراتر از این مقدار رود، نواحی به صورت دورهای مطابق با آنچه در zone_reset_frequency مشخص شده است بازنشانی میشوند. اگر هنگام استفاده از این گزینه چندین کار وجود داشته باشد، محدوده IO برای همه کارهای نوشتن باید یکسان باشد.
- zone_reset_frequency=float
- عددی بین صفر و یک که مشخص میکند در صورت فراتر رفتن از آستانه بازنشانی ناحیه، بازنشانی ناحیه هر چند وقت یکبار باید ارسال شود. یک بازنشانی ناحیه پس از هر (1 / zone_reset_frequency) درخواست نوشتن ارسال میشود. از این پارامتر و پارامتر پیشین میتوان برای شبیهسازی فعالیت بازیافت حافظه (garbage collection) استفاده کرد.
- recover_zbd_write_error=bool
- اگر این گزینه به همراه گزینه continue_on_error مشخص شود، پس از نوشتنهای ناموفق در نواحی sequential write required، موقعیتهای اشارهگر نوشتن بررسی میشود. سپس اشارهگرهای نوشتن جابهجا میشوند تا نوشتنهای بعدی به دلیل نوشتنهای ناقص و موقعیتهای پیشبینینشده اشارهگر نوشتن با شکست مواجه نشوند. اگر continue_on_error مشخص نشده باشد، برنامه با خطا متوقف میشود. هنگامی که نوشتنها به صورت ناهمگام (asynchronous) باشند، جابهجایی اشارهگر نوشتن بلوکها را با صفر پر میکند و سپس دادههای اعتبارسنجی را مخدوش میسازد. اگر یک موتور IO ناهمگام و بار کاری verify مشخص شده باشد، با خطا متوقف میشود. پیشفرض: false.
- write_zone_remainders=bool
- اگر اندازه فضای ننوشتهشده در یک ناحیه در ابتدای بار کاری، مضربی از اندازه بلوک مشخصشده نباشد، بارهای کاری نوشتن نواحی باقیمانده ننوشتهشدهای در انتهای نواحی ایجاد میکنند. بهطور پیشفرض، fio عملیاتهای zone finish را روی چنین نواحی اجرا میکند و وضعیت آنها را به وضعیت کامل (full) برده و منابع نواحی باز را آزاد میسازد. با این حال، عملیاتهای zone finish باعث ایجاد انتظار برای نوشتنهای در جریان (in-flight) میشود و توان عملیاتی کلی نوشتن را کاهش میدهد. اگر این گزینه مشخص شود، fio به جای انجام عملیاتهای zone finish، دادهها را در نواحی باقیمانده مینویسد. این امر با جلوگیری از انتظار برای نوشتنهای در حال انجام، بهویژه در بارهای کاری نوشتن ناهمگام، توان عملیاتی نوشتن را بهبود میبخشد. عیب این گزینه این است که نیازمند انجام عملیاتهای نوشتن کوچکتر از حداقل اندازه بلوک توسط fio است. در نتیجه، گزینه norandommap باید تنظیم شود. اگر norandommap تنظیم نشده باشد، به طور خودکار فعال خواهد شد. پیشفرض: false..SS "نوع I/O (I/O type)"
- direct=bool
- اگر مقدار true باشد، از I/O بدون بافر استفاده میشود. این معمولاً O_DIRECT است. توجه داشته باشید که OpenBSD و ZFS روی Solaris از direct I/O پشتیبانی نمیکنند. در Windows، موتورهای ورودی/خروجی (ioengines) همگام از direct I/O پشتیبانی نمیکنند. پیشفرض: false.
- buffered=bool
- اگر مقدار true باشد، از I/O بافری استفاده میشود. این برعکس گزینهٔ direct است. پیشفرض: true.
- readwrite=str, rw=str
- نوع الگوی I/O. مقادیر پذیرفتهشده عبارتند از:
- read
- خواندنهای ترتیبی.
- write
- نوشتنهای ترتیبی.
- trim
- تریمهای (trim) ترتیبی (تنها برای دستگاههای بلوکی Linux و دستگاههای نویسهای SCSI).
- randread
- خواندنهای تصادفی.
- randwrite
- نوشتنهای تصادفی.
- randtrim
- تریمهای (trim) تصادفی (تنها برای دستگاههای بلوکی Linux و دستگاههای نویسهای SCSI).
- rw,readwrite
- خواندن و نوشتنهای ترکیبی ترتیبی.
- randrw
- خواندن و نوشتنهای ترکیبی تصادفی.
- trimwrite
- توالیهای ترتیبی trim+write. بلوکها ابتدا تریم میشوند، سپس روی همان بلوکها نوشته خواهد شد. بنابراین اگر `io_size=64K' مشخص شده باشد، Fio در مجموع ۶۴ کیلوبایت را تریم کرده و همچنین ۶۴ کیلوبایت را روی همان بلوکهای تریمشده مینویسد. این رفتار با `number_ios' یا دیگر گزینههای Fio که بایتهای کل یا تعداد I/Oها را محدود میکنند، سازگار خواهد بود.
- randtrimwrite
- مانند trimwrite ، اما به جای نوشتنهای ترتیبی از آفستهای تصادفی استفاده میکند.
اگر گزینه مشخص نشده باشد، پیشفرض Fio مقدار read است. برای انواع I/O ترکیبی، پیشفرض تقسیم ۵۰/۵۰ آنها است. برای انواع خاصی از I/O ممکن است نتیجه کمی نامتوازن باشد، زیرا سرعت ممکن است متفاوت باشد.
میتوان تعداد I/Oهایی را که باید قبل از دریافت یک آفست جدید انجام شوند، با افزودن `:<nr>' به انتهای رشتهٔ ارائهشده مشخص کرد. برای یک خواندن تصادفی، اعمال یک تعدیلکنندهٔ آفست با مقدار ۸ به شکل `rw=randread:8' خواهد بود. اگر این پسوند با یک الگوی I/O ترتیبی استفاده شود، مقدار `<nr>' مشخصشده به آفست تولیدشده برای هر I/O اضافه میشود که I/O ترتیبی را به I/O ترتیبی با فاصله (حفره) تبدیل میکند. به عنوان مثال، استفاده از `rw=write:4k' برای هر بار نوشتن مقدار 4k را نادیده میگیرد (میپرد). همچنین گزینهٔ rw_sequencer را ببینید. اگر این مورد همراه با verify استفاده شود، گزینهٔ verify_header_seed غیرفعال خواهد شد، مگر اینکه بهطور صریح فعال شده باشد.
- rw_sequencer=str
- اگر یک تعدیلکنندهٔ آفست با افزودن یک عدد به خط `rw=str' مشخص شود، این گزینه نحوهٔ اصلاح آفست I/O تولیدشده توسط آن عدد را کنترل میکند. مقادیر پذیرفتهشده عبارتند از:
- sequential
- ایجاد آفست ترتیبی.
- identical
- ایجاد آفست یکسان.
مقدار sequential فقط برای I/O تصادفی مفید است، جایی که fio معمولاً برای هر I/O یک آفست تصادفی جدید ایجاد میکند. اگر برای مثال عدد ۸ را به randread اضافه کنید، یعنی `rw=randread:8'، به ازای هر ۸ عدد I/O یک آفست تصادفی جدید دریافت خواهید کرد. نتیجه توالیای از ۸ آفست ترتیبی با یک نقطهٔ شروع تصادفی خواهد بود. با این حال، اگر یک I/O ترتیبی به انتهای فایل برسد ممکن است این رفتار تغییر کند. از آنجا که I/O ترتیبی از قبل ترتیبی است، تنظیم sequential برای آن تفاوتی ایجاد نمیکند. مقدار identical به شکلی مشابه عمل میکند، با این تفاوت که آفست یکسانی را ۸ بار قبل از ایجاد یک آفست جدید ارسال میکند.
مثال ۱:
rw=randread:8
rw_sequencer=sequential
bs=4k
توالی آفستهای تولیدشده به این صورت خواهد بود: 4k, 8k, 12k, 16k, 20k, 24k, 28k, 32k, 92k, 96k, 100k, 104k, 108k, 112k, 116k, 120k, 48k, 52k ...
مثال ۲:
rw=randread:8
rw_sequencer=identical
bs=4k
توالی آفستهای تولیدشده به این صورت خواهد بود: 4k, 4k, 4k, 4k, 4k, 4k, 4k, 4k, 92k, 92k, 92k, 92k, 92k, 92k, 92k, 92k, 48k, 48k, 48k ...
- unified_rw_reporting=str
- Fio معمولاً آمارها را بر اساس جهت داده (data direction) گزارش میدهد، به این معنی که خواندنها، نوشتنها و تریمها بهطور جداگانه محاسبه و گزارش میشوند. این گزینه تعیین میکند که آیا fio نتایج را بهصورت عادی، جمعشده با یکدیگر، یا در هر دو حالت گزارش دهد. مقادیر پذیرفتهشده عبارتند از:
- randrepeat=bool
- مقداردهی اولیه (seed) همهٔ مولدهای اعداد تصادفی به روشی قابل پیشبینی، بهگونهای که الگو در طول اجراهای مختلف تکرارپذیر باشد. پیشفرض: true.
- allrandrepeat=bool
- نام مستعار برای randrepeat. پیشفرض: true.
- randseed=int
- مقداردهی اولیه (seed) مولدهای اعداد تصادفی بر اساس این مقدار seed، تا بتوان توالی خروجی تولیدشده را کنترل کرد. در صورت عدم تنظیم، توالی تصادفی به تنظیمات randrepeat وابسته خواهد بود.
- fallocate=str
- تعیین اینکه آیا هنگام ایجاد فایلها پیشتخصیص فضا انجام شود یا خیر. مقادیر پذیرفتهشده عبارتند از:
- none
- فضا را از پیش تخصیص نده.
- native
- استفاده از فراخوانی بومی پیشتخصیص سکوی کاری، اما در صورت شکست یا پیادهسازی نشدن، بازگشت به رفتار none.
- posix
- پیشتخصیص از طریق posix_fallocate(3).
- keep
- پیشتخصیص از طریق fallocate(2) همراه با تنظیم FALLOC_FL_KEEP_SIZE.
- truncate
- افزایش اندازهٔ فایل به اندازهٔ نهایی با استفاده از ftruncate|(2) به جای تخصیص فضا.
- 0
- نام مستعار سازگار با گذشته برای none.
- 1
- نام مستعار سازگار با گذشته برای posix.
ممکن است در تمام بسترهای پشتیبانیشده در دسترس نباشد. مقدار keep تنها در Linux موجود است. هنگام استفاده از ZFS در Solaris نمیتوان آن را روی posix تنظیم کرد چرا که ZFS از پیشتخصیص فضا پشتیبانی نمیکند. پیشفرض: native در صورتی که هر روش پیشتخصیصی به جز truncate در دسترس باشد، در غیر این صورت none.
توجه داشته باشید که استفاده از truncate در Windows رفتار پیشبینینشدهای با الگوهای نوشتن غیرترتیبی خواهد داشت. هنگام نوشتن روی فایلی که با تنظیم اطلاعات انتهای فایل (end-of-file) گسترش یافته است، Windows قبل از اعمال نوشتن جدید، بخش نوشتهنشدهٔ فایل را تا آن آفست با صفر پر میکند. این بدان معناست که یک نوشتن کوچک در انتهای یک فایل گسترشیافته تا زمانی که کل فایل با صفر پر نشود، متوقف خواهد ماند. fadvise_hint=str از posix_fadvise(2) یا posix_madvise(2) برای اعلان به هسته درباره اینکه چه الگوهای I/O احتمالاً صادر خواهند شد استفاده میکند. مقادیر پذیرفتهشده عبارتند از:
- 0
- راهنمایی سازگار با نسخههای پیشین برای «بدون راهنمایی» (no hint).
- 1
- راهنمایی سازگار با نسخههای پیشین برای «اعلان بر اساس نوع بار کاری fio». این گزینه برای بار کاری تصادفی از FADV_RANDOM و برای بار کاری ترتیبی از FADV_SEQUENTIAL استفاده میکند.
- sequential
- اعلان با استفاده از FADV_SEQUENTIAL.
- random
- اعلان با استفاده از FADV_RANDOM.
- noreuse
- اعلان با استفاده از FADV_NOREUSE. این مقدار ممکن است در هستههای قدیمیتر لینوکس بدون عملیات (no-op) باشد. از نسخه ۶.۳ لینوکس، راهنمایی برای الگوریتم LRU فراهم میکند. صفحه راهنمای posix_fadvise(2) را ببینید.
- write_hint=str
- از fcntl(2) برای اعلان طول عمر مورد انتظار از یک نوشتن به هسته استفاده میکند. این ویژگی تنها در لینوکس، از نسخه ۴.۱۳ به بعد پشتیبانی میشود. مقادیر پذیرفتهشده عبارتند از:
این مقادیر همگی نسبت به یکدیگر سنجیده میشوند و نباید معنای مطلقی برای آنها در نظر گرفت.
- offset=int[%|z]
- عملیات I/O را در آفست ارائهشده در فایل آغاز میکند، که میتواند به صورت یک اندازه ثابت بر حسب بایت، ناحیه (zones) یا درصد داده شود. در صورت ارائه درصد، آفست تولیدشده با کمینه blocksize یا با مقدار offset_align (در صورت تعیین) تراز خواهد شد. به دادههای قبل از آفست دادهشده دست زده نخواهد شد. این کار در عمل اندازه فایل را به `real_size - offset' محدود میکند. میتواند با size ترکیب شود تا محدوده شروع و پایان بار کاری I/O مقید گردد. درصد میتواند با عددی بین ۱ و ۱۰۰ همراه با '%' مشخص شود؛ برای نمونه `offset=20%' برای تعیین ۲۰٪. در حالت ZBD، مقدار میتواند با استفاده از 'z' به صورت تعداد نواحی تنظیم شود.
- offset_align=int
- اگر روی مقداری غیر از صفر تنظیم شود، آفست بایتی تولیدشده از یک offset درصدی به سمت بالا با این مقدار تراز میشود. مقدار پیشفرض 0 است، به این معنی که آفست درصدی با کمینه اندازه بلوک تراز میگردد.
- offset_increment=int[%|z]
- در صورت تعیین این گزینه، آفست واقعی به صورت `offset + offset_increment * thread_number' درمیآید، که در آن thread_number شمارندهای است که از 0 شروع شده و به ازای هر زیروظیفه (یعنی هنگامی که گزینه numjobs مشخص شده باشد) افزایش مییابد. این گزینه زمانی مفید است که چندین وظیفه بخواهند روی یک فایل در بخشهای مجزا و موازی با فواصل یکنواخت بین نقاط آغازین کار کنند. برای این گزینه میتوان از درصد نیز استفاده کرد. در صورت تعیین درصد، آفست تولیدشده با کمینه blocksize یا مقدار offset_align (در صورت تعیین) تراز خواهد شد. در حالت ZBD، مقدار میتواند با استفاده از 'z' به صورت تعداد نواحی تنظیم شود.
- number_ios=int
- برنامه fio به طور معمول عملیاتهای I/O را تا زمانی انجام میدهد که اندازه محدوده تعیینشده توسط size پایان یابد، یا زمان اختصاصدادهشده به پایان برسد (یا با یک وضعیت خطا مواجه شود). با این تنظیم، محدوده/اندازه را میتوان مستقل از تعداد I/Oهای اجرایی تنظیم کرد. هنگامی که fio به این تعداد برسد، به طور معمول خارج شده و وضعیت را گزارش میکند. توجه داشته باشید که این گزینه میزان I/O انجامشده را افزایش نمیدهد، بلکه تنها در صورتی که این شرط پیش از سایر معیارهای پایان وظیفه برآورده شود، fio را متوقف میکند.
- fsync=int
- در صورت نوشتن در فایل، به ازای هر تعداد بلوک دادهشده، یک fsync(2) (یا معادل آن) برای دادههای تغییریافته (dirty) صادر میکند. برای نمونه، اگر ۳۲ را به عنوان پارامتر بدهید، fio فایل را پس از هر ۳۲ نوشتن صادرشده همگامسازی میکند. اگر fio از I/O بدون بافر استفاده کند، ممکن است فایل را همگامسازی نکنیم. استثنا موتور sg I/O است که در هر صورت کَش دیسک را همگامسازی میکند. مقدار پیشفرض 0 است، به این معنی که fio به طور دورهای همگامسازی را صادر نکرده و منتظر تکمیل آن نمیماند. همچنین گزینههای end_fsync، end_syncfs و fsync_on_close را ببینید.
- fdatasync=int
- مانند fsync است اما از fdatasync(2) استفاده میکند تا تنها بلوکهای داده و نه فراداده (metadata) را همگامسازی کند. در Windows، DragonFlyBSD یا OSX فراخوانی fdatasync(2) وجود ندارد، بنابراین به استفاده از fsync(2) برمیگردد. مقدار پیشفرض 0 است، به این معنی که fio به طور دورهای همگامسازی صرفاً داده را صادر نکرده و منتظر تکمیل آن نمیماند.
- write_barrier=int
- هر N-اُمین عمل نوشتن را به یک نوشتن سدگونه (barrier write) تبدیل میکند.
- sync_file_range=str:int
- به ازای هر تعداد int از عملیاتهای نوشتن، از sync_file_range(2) استفاده میکند. برنامه fio محدوده نوشتههایی را که پس از آخرین فراخوانی sync_file_range(2) رخ دادهاند، ردگیری خواهد کرد. str در حال حاضر میتواند یک یا چند مورد از گزینههای زیر باشد:
- wait_before
- SYNC_FILE_RANGE_WAIT_BEFORE
- write
- SYNC_FILE_RANGE_WRITE
- wait_after
- SYNC_FILE_RANGE_WRITE_AFTER
بنابراین اگر از `sync_file_range=wait_before,write:8' استفاده کنید، fio به ازای هر ۸ نوشتن از `SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE' استفاده خواهد کرد. همچنین به صفحه راهنمای sync_file_range(2) مراجعه کنید. این گزینه مختص لینوکس است.
- overwrite=bool
- اگر مقدار true باشد، نوشتنها در فایل همیشه دادههای موجود را رونویسی میکنند. اگر فایل از پیش وجود نداشته باشد، قبل از آغاز مرحله نوشتن ایجاد خواهد شد. اگر فایل وجود داشته باشد و برای مرحله نوشتن مشخصشده به اندازه کافی بزرگ باشد، هیچ کاری انجام نخواهد شد. پیشفرض: false.
- end_fsync=bool
- اگر مقدار true باشد، با پایان یک مرحله نوشتن، محتویات فایل را با fsync(2) همگامسازی میکند. پیشفرض: false.
- end_syncfs=bool
- معادل end_fsync است، اما به جای اجرای fsync(2) برای هر فایل از یک مرحله نوشتن، با استفاده از فراخوانی سیستمی منفرد syncfs(2) تمام فایلهای نوشتهشده را با اتمام مرحله نوشتن همگامسازی میکند. پیشفرض: false.
- fsync_on_close=bool
- اگر مقدار true باشد، fio هنگام بستن فایل دارای دادههای همگامنشده (dirty)، فراخوانی fsync(2) را صادر میکند. این گزینه با end_fsync تفاوت دارد، زیرا هنگام بستن هر فایل اتفاق میافتد، نه فقط در پایان وظیفه. پیشفرض: false.
- rwmixread=int
- درصد بار کاری ترکیبی که باید شامل خواندن باشد. پیشفرض: 50.
- rwmixwrite=int
- درصد بار کاری ترکیبی که باید شامل نوشتن باشد. اگر هر دو گزینه rwmixread و rwmixwrite مشخص شده باشند و مجموع مقادیر آنها ۱۰۰٪ نشود، مقدار دومی برای بازنویسی اولی به کار خواهد رفت. اگر از fio خواسته شود که خواندن یا نوشتن را به نرخ مشخصی محدود کند، این موضوع ممکن است با تنظیم نرخ تداخل داشته باشد. در این صورت، ممکن است توزیع دچار انحراف شود. پیشفرض: 50.
- random_distribution=str:float[:float][,str:float][,str:float]
- به طور پیشفرض، هنگامی که از fio خواسته شود I/O تصادفی انجام دهد، از توزیع تصادفی کاملاً یکنواخت استفاده خواهد کرد. گاهی اوقات مفید است که توزیع را به شیوههای خاصی منحرف کنیم تا اطمینان حاصل شود بخشهایی از دادهها نسبت به بخشهای دیگر داغتر (پرمراجعهتر) هستند. برنامه fio شامل مدلهای توزیع زیر است:
هنگام استفاده از توزیع zipf یا pareto، یک مقدار ورودی نیز برای تعریف الگوی دسترسی لازم است. برای zipf این مقدار `Zipf theta' است. برای pareto مقدار `Pareto power' است. برنامه fio شامل یک برنامه آزمایشی به نام fio-genzipf است که میتواند برای مصورسازی آنچه مقادیر ورودی دادهشده از نظر نرخ اصابت حاصل میکنند به کار رود. اگر میخواستید از zipf با یک `theta' برابر با 1.2 استفاده کنید، از گزینه `random_distribution=zipf:1.2' استفاده میکردید. در صورت استفاده از یک مدل غیریکنواخت، fio استفاده از نگاشت تصادفی (random map) را غیرفعال خواهد کرد. برای توزیع normal، یک انحراف نرمال (گاوسی) به صورت مقداری بین 0 تا 100 ارائه میشود.
مقدار ممیز شناور دوم و اختیاری برای توزیعهای pareto، zipf و normal مجاز است. این مقدار امکان میدهد مبنای توزیع در مکانی غیر از پیشفرض تنظیم شود، که کنترل بیشتری روی محتملترین نتیجه فراهم میکند. این مقدار در بازه [0-1] است که به صورت خطی به محدوده مقادیر تصادفی ممکن نگاشت میشود. مقادیر پیشفرض عبارتند از: تصادفی برای pareto و zipf، و 0.5 برای normal. اگر میخواستید از zipf با مقدار `theta` برابر با 1.2 و متمرکز بر ۱/۴ محدوده مجاز مقادیر استفاده کنید، از `random_distribution=zipf:1.2:0.25' استفاده میکردید.
برای توزیع zoned، برنامه fio از تعیین درصدهایی از دسترسی I/O که باید در کدام محدوده از فایل یا دستگاه قرار گیرند پشتیبانی میکند. برای نمونه، با در نظر گرفتن این معیارها:
۶۰٪ دسترسیها باید به ۱۰٪ نخست باشد
۳۰٪ دسترسیها باید به ۲۰٪ بعدی باشد
۸٪ دسترسیها باید به ۳۰٪ بعدی باشد
۲٪ دسترسیها باید به ۴۰٪ بعدی باشد
میتوانیم آن را از طریق ناحیهبندی دسترسیهای تصادفی تعریف کنیم. برای مثال بالا، کاربر به این شیوه عمل میکند:
random_distribution=zoned:60/10:30/20:8/30:2/40
یک توزیع zoned_abs دقیقاً مانند zoned عمل میکند، با این تفاوت که اندازههای مطلق را میگیرد. برای نمونه، فرض کنید میخواستید دسترسی را بر اساس معیارهای زیر تعریف کنید:
۶۰٪ دسترسیها باید به 20G نخست باشد
۳۰٪ دسترسیها باید به 100G بعدی باشد
۱۰٪ دسترسیها باید به 500G بعدی باشد
میتوانیم یک توزیع ناحیهبندی مطلق را با دستور زیر تعریف کنیم:
random_distribution=zoned:60/10:30/20:8/30:2/40
برای هر دو توزیع zoned و zoned_abs، برنامه fio از تعریف تا حداکثر ۲۵۶ ناحیه جداگانه پشتیبانی میکند.
مشابه روش عملکرد bssplit برای تنظیم محدودهها و درصدهای اندازههای بلوک. همانند bssplit، تعیین نواحی جداگانه برای عملیاتهای خواندن، نوشتن و trim امکانپذیر است. اگر تنها یک مجموعه ارائه شود، برای همه آنها اعمال خواهد شد. percentage_random=int[,int][,int] برای یک بار کاری تصادفی، مشخص میکند چه درصدی از عملیات باید تصادفی باشد. مقدار پیشفرض این گزینه %100 است که در این حالت بار کاری کاملاً تصادفی خواهد بود. این مقدار میتواند از 0 تا 100 تنظیم شود. تنظیم آن روی 0 بار کاری را کاملاً ترتیبی میکند. هر مقداری بین این دو منجر به ترکیبی تصادفی از I/O ترتیبی و تصادفی، بر اساس درصدهای ارائهشده خواهد شد. مقادیر جداشده با کاما میتوانند برای خواندن، نوشتن و trim مطابق با آنچه در blocksize توضیح داده شده است مشخص شوند.
- norandommap
- بهطور معمول fio هنگام انجام I/O تصادفی، تمام بلوکهای فایل را پوشش میدهد. اگر این گزینه مشخص شود، fio بدون نگاه کردن به تاریخچه قبلی I/O، صرفاً یک آفست تصادفی جدید دریافت میکند. این بدان معناست که ممکن است برخی بلوکها اصلاً خوانده یا نوشته نشوند، و برخی بلوکها بیش از یک بار خوانده/نوشته شوند. اگر این گزینه به همراه verify استفاده شود، verify_header_seed غیرفعال خواهد شد. اگر این گزینه به همراه verify و اندازههای بلوک چندگانه (از طریق bsrange) استفاده شود، تنها بلوکهای دستنخورده اعتبارسنجی میشوند؛ یعنی بلوکهایی که تا حدی رونویسی (partially-overwritten) شدهاند نادیده گرفته میشوند. با یک موتور I/O ناهمگام (async) و عمق I/O بیشتر از 1 (I/O depth > 1)، اعتبارسنجی شماره توالی نوشتن سرایند غیرفعال خواهد شد. verify_write_sequence را ببینید.
- softrandommap=bool
- به norandommap مراجعه کنید. اگر fio با نگاشت بلوک تصادفیِ فعال اجرا شود و در تخصیص نگاشت با شکست مواجه گردد، در صورت تنظیم این گزینه، بدون نگاشت بلوک تصادفی به کار خود ادامه میدهد. از آنجا که پوشش بلوکها به کاملیِ حالت نگاشت تصادفی نخواهد بود، این گزینه به صورت پیشفرض غیرفعال است.
- random_generator=str
- برنامه fio از موتورهای زیر برای تولید آفستهای I/O در عملیات تصادفی پشتیبانی میکند:
- tausworthe
- تولیدکننده اعداد تصادفی قوی با چرخه 2^88.
- lfsr
- تولیدکننده ثبات تغییر بازخورد خطی (Linear feedback shift register).
- tausworthe64
- تولیدکننده اعداد تصادفی قوی ۶۴ بیتی با چرخه 2^258.
tausworthe یک تولیدکننده اعداد تصادفی قوی است، اما اگر بخواهیم اطمینان حاصل کنیم که بلوکها تنها یکبار خوانده یا نوشته میشوند، به ردیابی جانبی نیاز دارد. lfsr تضمین میکند که هرگز یک آفست دو بار تولید نشود و همچنین از نظر محاسباتی کمهزینهتر است. با این حال، یک تولیدکننده تصادفی واقعی نیست، گرچه برای اهداف I/O معمولاً به اندازه کافی خوب است. lfsr تنها با اندازه بلوک منفرد کار میکند، نه با بارهای کاری که از چندین اندازه بلوک استفاده میکنند. اگر با چنین بارهای کاری استفاده شود، ممکن است fio برخی بلوکها را چندین بار بخواند یا بنویسد. مقدار پیشفرض tausworthe است، مگر اینکه فضای مورد نیاز از 2^32 بلوک فراتر رود؛ در این صورت tausworthe64 به طور خودکار انتخاب میشود.
- sprandom=bool
- روش SPRandom روشی
است که برای
آمادهسازی
سریع اولیه
(precondition)
درایوهای SSD
جهت بارهای
کاری نوشتن
تصادفی در
وضعیت
پایدار (steady-state)
طراحی شده
است. این
روش دستگاه
را به
ناحیههایی
با اندازه
یکسان
تقسیم کرده
و کل ظرفیت
فیزیکی
دستگاه را
یک بار
بازنویسی
میکند، و
آفستها را
بهگونهای
انتخاب
مینماید
که
ناحیهها
دارای
توزیعی از
بلوکهای
نامعتبر
متناسب با
توزیع
رخداده در
وضعیت
پایدار
باشند.
پیشفرض: false.
این گزینه از random_generator=lfsr استفاده میکند که fio آن را به صورت پیشفرض تنظیم خواهد کرد. انتخاب هر مولد تصادفی دیگری منجر به خطا خواهد شد.
- spr_num_regions=int
- به sprandom مراجعه کنید. تعداد ناحیههای مورد استفاده برای SPRandom را مشخص میکند. پیشفرض: 100
- spr_cs=int
- به sprandom مراجعه کنید. اندازه حافظه موقت (کش) را بر حسب بایت، طبق مشخصات سازنده SSD تعیین میکند.
- spr_op=float
- به sprandom مراجعه کنید. نسبت بیشتجهیز (Over-provisioning) در بازه (0, 1)، طبق مشخصات اعلامشده توسط سازنده SSD. پیشفرض: 0.15.
اندازه بلوک (Block size)
- blocksize=int[,int][,int], bs=int[,int][,int]
- اندازه بلوک بر حسب بایت که برای واحدهای I/O استفاده میشود. پیشفرض: 4096. تعیین یک مقدار منفرد برای خواندن، نوشتن و trim اعمال میشود. مقادیر جداشده با کاما میتوانند برای خواندن، نوشتن و trim مشخص شوند. مقداری که به کاما ختم نشود به انواع بعدی اعمال میگردد. مثالها:
bs=256k به معنای 256k برای خواندن، نوشتن و trim است.
bs=8k,32k به معنای 8k برای خواندن، و 32k برای نوشتن و trim است.
bs=8k,32k, به معنای 8k برای خواندن، 32k برای نوشتن، و پیشفرض برای trim است.
bs=,8k به معنای پیشفرض برای خواندن، و 8k برای نوشتن و trim است.
bs=,8k, به معنای پیشفرض برای خواندن، 8k برای نوشتن، و پیشفرض برای trim است.
- blocksize_range=irange[,irange][,irange], bsrange=irange[,irange][,irange]
- محدودهای از اندازههای بلوک بر حسب بایت برای واحدهای I/O. واحد I/O صادرشده همواره مضربی از حداقل اندازه خواهد بود، مگر اینکه blocksize_unaligned تنظیم شده باشد. محدودههای جداشده با کاما میتوانند برای خواندن، نوشتن و trim مطابق آنچه در blocksize شرح داده شده است مشخص شوند. مثال:
bsrange=1k-4k,2k-8k یا bsrange=1k:4k,2k:8k
- bssplit=str[,str][,str]
- گاهی اوقات کنترل دقیقتری بر اندازههای بلوک صادرشده مورد نیاز است، نه صرفاً یک تقسیم یکنواخت بین آنها. این گزینه به شما اجازه میدهد به اندازههای مختلف بلوک وزن اختصاص دهید، بهطوری که بتوانید نسبت مشخصی از اندازههای بلوک صادرشده را تعیین کنید. ساختار این گزینه به شکل زیر است:
bssplit=blocksize/percentage:blocksize/percentage
به تعداد اندازههای بلوک مورد نیاز. بنابراین اگر میخواهید بار کاری تعریف کنید که دارای %50 بلوکهای 64k، %10 بلوکهای 4k و %40 بلوکهای 32k باشد، اینگونه مینویسید:
bssplit=4k/10:64k/50:32k/40
ترتیب آنها اهمیتی ندارد. اگر درصد خالی رها شود، fio مقادیر باقیمانده را به صورت یکسان تقسیم خواهد کرد. بنابراین گزینهای مانند این:
bssplit=4k/50:1k/:32k/
دارای %50 عملیات 4k، و %25 عملیات برای هر یک از اندازههای 1k و 32k خواهد بود. مجموع درصدها همواره باید به 100 برسد؛ اگر به bssplit محدودهای داده شود که مجموع آن بیشتر شود، با خطا متوقف خواهد شد.
مقادیر جداشده با کاما میتوانند برای خواندن، نوشتن و trim مطابق با توضیحات blocksize مشخص شوند.
اگر باری کاری میخواهید که دارای %50 خواندنهای 2k و %50 خواندنهای 4k باشد، در حالی که دارای %90 نوشتنهای 4k و %10 نوشتنهای 8k است، به این صورت مشخص میکنید:
bssplit=2k/50:4k/50,4k/90:8k/10
برنامه fio از تعریف حداکثر 64 وزن مختلف برای هر جهت داده پشتیبانی میکند.
- blocksize_unaligned, bs_unaligned
- در صورت تنظیم، fio واحدهای I/O را با هر اندازهای درون blocksize_range صادر میکند، نه فقط مضاربی از حداقل اندازه. این گزینه معمولاً با direct I/O کار نخواهد کرد، زیرا direct I/O معمولاً به تراز بخش (sector alignment) نیاز دارد.
- bs_is_seq_rand=bool
- اگر این گزینه تنظیم شود، fio تنظیمات معمول اندازه بلوک read,write را به عنوان تنظیمات اندازه بلوک sequential,random در نظر میگیرد. هر خواندن یا نوشتن تصادفی از تنظیمات اندازه بلوک WRITE، و هر خواندن یا نوشتن ترتیبی از تنظیمات اندازه بلوک READ استفاده خواهد کرد.
- blockalign=int[,int][,int], ba=int[,int][,int]
- مرزی که fio واحدهای I/O تصادفی را با آن تراز میکند. پیشفرض: blocksize. حداقل میزان تراز برای استفاده از direct I/O معمولاً 512b است، اگرچه معمولاً به اندازه بلوک سختافزاری بستگی دارد. این گزینه با استفاده از نگاشت تصادفی برای فایلها مانعةالجمع است، بنابراین آن گزینه را غیرفعال خواهد کرد. مقادیر جداشده با کاما میتوانند برای خواندن، نوشتن و trim مطابق آنچه در blocksize شرح داده شده است مشخص شوند..SS "بافرها و حافظه (Buffers and memory)"
- zero_buffers
- مقداردهی اولیه بافرها با تماماً صفر. پیشفرض: پر کردن بافرها با دادههای تصادفی.
- refill_buffers
- اگر این گزینه مشخص شود، fio در هر بار ثبت I/O (عملیات submit)، بافرهای I/O را دوباره پر میکند. پیشفرض این است که بافرها فقط در زمان مقداردهی اولیه پر شده و مجدداً از همان دادهها استفاده شود. طبیعتاً تنها زمانی کاربرد دارد که zero_buffers تعیین نشده باشد. در صورت فعال بودن اعتبارسنجی دادهها (data verification)، گزینه refill_buffers نیز بهطور خودکار فعال میشود.
- scramble_buffers=bool
- اگر refill_buffers بار پردازشی بالایی داشته باشد و مقصد از حذف دادههای تکراری (deduplication) استفاده کند، تنظیم این گزینه محتویات بافر I/O را اندکی تغییر میدهد تا تلاشهای معمول حذف دادههای تکراری خنثی شود. این کار برای بیاثر کردن فشردهسازیهای بلوکی هوشمندانهتر کافی نیست، اما جلوی dedupe سادهی بلوکها را میگیرد. پیشفرض: true.
- buffer_compress_percentage=int
- اگر این گزینه تنظیم شود، fio تلاش میکند محتوای بافر I/O را (در عملیات نوشتن/WRITE) به نحوی آماده کند که تا سطح تعیینشده فشرده شود. fio این کار را با ارائه ترکیبی از دادههای تصادفی و به دنبال آن دادههایی با الگوی ثابت انجام میدهد. الگوی ثابت یا صفرها هستند، یا الگویی که توسط buffer_pattern تعیین شده است. در صورت استفاده از گزینه buffer_pattern، ممکن است نسبت فشردهسازی کمی تغییر کند. تنظیم buffer_compress_percentage روی مقداری غیر از ۱۰۰ همچنین گزینه refill_buffers را فعال میکند تا احتمال شباهت زیاد بلوکهای مجاور و فشردهسازی بیشازحد آنها در کنار هم کاهش یابد. برای نحوه تنظیم دانهبندی (granularity) ریزتر یا درشتترِ نواحی دادههای تصادفی/ثابت، به buffer_compress_chunk مراجعه کنید. پیشفرض تنظیمنشده است؛ یعنی دادههای بافر از هیچ سطح فشردهسازی تبعیت نخواهند کرد.
- buffer_compress_chunk=int
- این تنظیم به fio اجازه میدهد تا اندازه ناحیه دادههای تصادفی/ثابت را هنگام استفاده از buffer_compress_percentage مدیریت کند. هنگامی که buffer_compress_chunk روی مقدار غیرصفری کوچکتر از اندازه بلوک (block size) تنظیم شود، fio میتواند ناحیه تصادفی/ثابت را در فواصل مشخصشده در سراسر بافر I/O تکرار کند (که بهویژه زمانی که اندازههای بلوک بزرگتری برای یک کار استفاده میشود کاربرد دارد). هنگامی که روی ۰ تنظیم شود، fio از اندازهی تکهای (chunk size) منطبق با اندازه بلوک استفاده خواهد کرد که منجر به یک ناحیه تصادفی/ثابت واحد درون بافر I/O میشود. پیشفرض: ۵۱۲. در صورت عدم ذکر واحد، مقدار بر حسب بایت تفسیر میشود.
- buffer_pattern=str
- در صورت تنظیم، fio بافرهای I/O را با این الگو یا با محتویات یک فایل پر میکند. اگر تنظیم نشود، محتویات بافرهای I/O توسط سایر گزینههای مربوط به محتوای بافر تعیین میشود. این تنظیم میتواند هر الگویی از بایتها باشد و برای مقادیر هگزادسیمال میتواند پیشوند 0x داشته باشد. همچنین میتواند یک رشته باشد، که در این صورت رشته باید داخل "" قرار گیرد. یا میتواند نام یک فایل باشد، که در این حالت نام فایل باید داخل '' قرار گیرد که در این صورت فایل باز و خوانده میشود. توجه داشته باشید که اگر خواندن تمام محتوای فایل باعث سرریز بافرها شود، تمام محتوای آن خوانده نخواهد شد. برای مثال:
buffer_pattern='filename'
یا:
buffer_pattern="abcd"
یا:
buffer_pattern=-12
یا:
buffer_pattern=0xdeadface
همچنین میتوانید همه چیز را به هر ترتیبی با هم ترکیب کنید:
buffer_pattern=0xdeadface"abcd"-12'filename'
- dedupe_percentage=int
- در صورت تنظیم، fio هنگام نوشتن این درصد از بافرهای یکسان را تولید میکند. این بافرها طبیعتاً قابلیت حذف تکرار (dedupe) دارند. محتویات بافرها به سایر تنظیمات فشردهسازی بافر که اعمال شدهاند بستگی دارد. این امکان وجود دارد که بافرهای منفرد کاملاً قابل فشردهسازی باشند یا اصلاً فشرده نشوند -- این گزینه تنها توزیع بافرهای یکتا (unique) را کنترل میکند. تنظیم این گزینه همچنین refill_buffers را فعال میکند تا از یکسان شدن همه بافرها جلوگیری شود.
- dedupe_mode=str
- اگر dedupe_percentage مشخص شده باشد، این گزینه نحوه تولید بافرهای dedupe توسط fio را کنترل میکند.
گزینه repeat حالت پیشفرض fio است. بافرهای dedupe با تکرار نوشتنهای یکتای قبلی ایجاد میشوند.
حالت working_set یک بار کاری واقعگرایانهتر است. با انتخاب working_set، باید گزینه dedupe_working_set_percentage نیز ارائه شود. با این کار، fio بافرهای نوشتن یکتای اولیه را به عنوان مجموعه کاری خود استفاده میکند. هنگامی که تصمیم به انجام dedupe گرفته شد، fio به طور تصادفی یک بافر از مجموعه کاری انتخاب میکند. توجه داشته باشید که با استفاده از working_set، درصد dedupe به مرور زمان به مقدار مطلوب همگرا میشود؛ در حالی که repeat مقدار درصد مطلوب را در طول کار حفظ میکند.
- dedupe_working_set_percentage=int
- اگر dedupe_mode روی working_set تنظیم شود، این گزینه درصدی از اندازه فایل یا دستگاه مورد استفاده به عنوان بافرها را کنترل میکند که fio برای تولید بافرهای dedupe از میان آنها انتخاب خواهد کرد.
- dedupe_global=bool
- این گزینه کنترل میکند که آیا بافرهای حذف تکرار (deduplication) بین تمام کارهایی که این گزینه را فعال کردهاند به اشتراک گذاشته شوند یا خیر. بافرها به طور مساوی بین کارهای مشارکتکننده پخش میشوند.
- invalidate=bool
- در صورت پشتیبانی پلتفرم و نوع فایل، بخشهای کش بافر/صفحه (buffer/page cache) فایلهای مورد استفاده را قبل از شروع I/O نامعتبر (invalidate) میکند. پیشفرض: true. اگر برای همان کار گزینه pre_read نیز مشخص شده باشد، این گزینه نادیده گرفته خواهد شد.
- sync=str
- اینکه آیا، و از چه نوع I/O همگامی (synchronous I/O) برای نوشتن استفاده شود. مقادیر مجاز عبارتند از:
- iomem=str, mem=str
- fio میتواند از انواع مختلف حافظه به عنوان بافر واحد I/O استفاده کند. مقادیر مجاز عبارتند از:
- malloc
- استفاده از حافظه اختصاصیافته از malloc(3) به عنوان بافرها. نوع حافظه پیشفرض.
- shm
- استفاده از حافظه اشتراکی (shared memory) به عنوان بافرها. تخصیصیافته از طریق shmget(2).
- shmhuge
- مشابه shm، اما با استفاده از صفحههای بزرگ (huge pages) به عنوان پشتیبان.
- mmap
- استفاده از mmap(2) برای تخصیص بافرها. میتواند حافظه ناشناس (anonymous memory) باشد، یا در صورت ذکر نام فایل پس از گزینه، با فایل پشتیبانی شود (file-backed). قالب آن به صورت `mem=mmap:/path/to/file' است.
- mmaphuge
- استفاده از یک فایل بزرگ نگاشتشده در حافظه به عنوان پشتیبان بافر. نام فایل پس از mmaphuge اضافه میشود، مانند `mem=mmaphuge:/hugetlbfs/file'.
- مشابه mmap، اما با استفاده از نگاشت MMAP_SHARED.
- cudamalloc
- استفاده از حافظه GPU به عنوان بافرها برای بنچمارک GPUDirect RDMA. گزینه ioengine باید rdma باشد.
فضای تخصیصیافته تابعی از حداکثر اندازه bs مجاز برای کار، ضربدر عمق I/O (I/O depth) مشخصشده است. توجه داشته باشید که برای کارکرد shmhuge و mmaphuge، سیستم باید صفحههای بزرگ آزاد تخصیصیافته داشته باشد. این مقدار معمولاً در سیستمهای لینوکس با خواندن/نوشتن در `/proc/sys/vm/nr_hugepages' قابل بررسی و تنظیم است. fio بسته به پلتفرم، اندازه یک huge page را ۲ یا ۴ مبیبایت (MiB) فرض میکند. بنابراین برای محاسبه تعداد صفحههای بزرگ مورد نیاز برای یک فایل کاری مشخص، عمق I/O تمام کارها را جمع کنید (معمولاً یک است، مگر اینکه از iodepth استفاده شود) و در حداکثر bs تعیینشده ضرب نمایید. سپس آن عدد را بر اندازه huge page تقسیم کنید. میتوانید اندازه huge pageها را در `/proc/meminfo' مشاهده نمایید. اگر با نبود یک عدد غیرصفر در `nr_hugepages' هیچ huge pageای تخصیص نیافته باشد، استفاده از mmaphuge یا shmhuge با شکست مواجه خواهد شد. همچنین به hugepage-size مراجعه کنید.
گزینه mmaphuge همچنین نیاز دارد که hugetlbfs سوار (mount) شده باشد و مسیر فایل باید به آنجا اشاره کند. بنابراین اگر در `/huge' سوار شده است، از `mem=mmaphuge:/huge/somefile' استفاده خواهید کرد. iomem_align=int, mem_align=int این گزینه همترازی حافظه بافرهای حافظه I/O را مشخص میکند. توجه داشته باشید که همترازی مشخصشده برای بافر نخستین واحد I/O اعمال میشود؛ در صورت استفاده از iodepth، همترازی بافرهای بعدی بر اساس bs مورد استفاده تعیین خواهد شد. به عبارت دیگر، در صورت استفاده از یک bs که مضربی از اندازه صفحه (page size) در سیستم باشد، تمام بافرها با این مقدار همتراز میشوند. در صورت استفاده از bs که با اندازه صفحه همتراز نباشد، همترازی بافرهای حافظه I/O بعدی حاصل جمع iomem_align و bs استفادهشده خواهد بود.
- hugepage-size=int
- اندازه یک huge page را تعریف میکند. باید حداقل برابر با تنظیمات سیستم باشد؛ به `/proc/meminfo' و `/sys/kernel/mm/hugepages/' مراجعه کنید. بسته به بستر اجرا، پیشفرض ۲ یا ۴ مگابایت (2MiB یا 4MiB) است. احتمالاً همیشه باید مضربی از مگابایت باشد، بنابراین استفاده از `hugepage-size=Xm' روش ترجیحی برای تنظیم این گزینه است تا از تعیین مقادیر نامناسب که توانی از ۲ نیستند جلوگیری شود.
- lockmem=int
- قفل کردن (Pin) مقدار حافظه مشخصشده با استفاده از mlock(2). میتواند برای شبیهسازی مقدار کمتری از حافظه استفاده شود. مقدار مشخصشده به ازای هر worker است.
اندازه I/O (I/O size)
- size=int[%|z]
- اندازه کل I/O فایل برای هر رشته (thread) از این کار. برنامه fio تا زمانی که این مقدار بایت منتقل شود اجرا خواهد شد، مگر اینکه زمان اجرا توسط عوامل دیگری تغییر یابد، از جمله (۱) runtime، (۲) io_size، (۳) number_ios، (۴) فاصلهها/حفرهها حین انجام عملیات I/O مانند `rw=read:16K'، یا (۵) رسیدن I/O متوالی به پایان فایل که در صورت کمتر بودن percentage_random از ۱۰۰ امکانپذیر است. برنامه fio این اندازه را میان فایلهای موجود که توسط گزینههایی مانند nrfiles و filename تعیین شدهاند تقسیم میکند، مگر اینکه filesize توسط کار مشخص شده باشد. اگر حاصل تقسیم برابر ۰ شود، در صورت وجود فایلها یا دستگاهها، اندازه برابر با اندازه فیزیکی فایلها یا دستگاههای دادهشده تنظیم میشود. اگر این گزینه مشخص نشده باشد، fio از اندازه کامل فایلها یا دستگاههای دادهشده استفاده خواهد کرد. اگر فایلها وجود نداشته باشند، اندازه باید مشخص شود. همچنین امکان تعیین اندازه به عنوان درصدی بین ۱ و ۱۰۰ وجود دارد. اگر `size=20%' داده شود، fio از ۲۰٪ اندازه کامل فایلها یا دستگاههای دادهشده استفاده خواهد کرد. در حالت ZBD، اندازه میتواند بر حسب تعداد zone با استفاده از 'z' تعیین شود. میتوان آن را با offset ترکیب کرد تا محدوده آغاز و پایان اجرای I/O محدود شود.
- io_size=int[%|z], io_limit=int[%|z]
- به طور معمول fio در محدودهای عمل میکند که توسط size تعیین شده است، به این معنی که گزینه size هم محدوده و هم اندازه I/O اجرایی را مشخص میکند. گاهی اوقات این مورد نظر نیست. با این گزینه، میتوان تنها مقدار I/O را که fio باید انجام دهد مشخص کرد. برای مثال، اگر size روی 20GiB و io_size روی 5GiB تنظیم شود، fio عملیات I/O را در محدوده 20GiB اول انجام میدهد اما پس از انجام 5GiB خارج میشود. حالت معکوس نیز امکانپذیر است -- اگر size روی 20GiB و io_size روی 40GiB تنظیم شود، fio به میزان 40GiB عملیات I/O را درون محدوده 0..20GiB انجام خواهد داد. مقدار میتواند به صورت درصد نیز تعیین شود: io_size=N%. در این حالت مقدار io_size در مقدار =size ضرب میشود. در حالت ZBD، مقدار میتواند با استفاده از 'z' به صورت تعداد zoneها نیز مشخص شود.
- filesize=irange(int)
- اندازه هر یک از فایلها به صورت جداگانه. ممکن است یک بازه باشد، که در این حالت fio اندازههای فایلها را به طور تصادفی در بازه دادهشده انتخاب میکند. اگر مشخص نشود، هر فایل ایجادشده اندازه یکسانی خواهد داشت. این گزینه از نظر اندازه فایل بر size اولویت دارد، یعنی size صرفاً پیشفرضی برای io_size میشود (و اگر io_size به طور صریح تعیین شده باشد، اصلاً هیچ اثری نخواهد داشت).
- file_append=bool
- انجام I/O پس از انتهای فایل. به طور معمول fio در محدوده اندازه یک فایل عمل میکند. اگر این گزینه تنظیم شود، fio در عوض دادهها را به انتهای فایل ضمیمه (append) میکند. این رفتار مشابه تنظیم offset به اندازه فایل است. این گزینه برای فایلهای غیرعادی (non-regular) نادیده گرفته میشود.
- fill_device=bool, fill_fs=bool
- اندازه را روی مقداری بسیار بزرگ تنظیم میکند و برای ENOSPC (نبود فضای خالی روی دستگاه) یا EDQUOT (فراتر رفتن از سهمیه دیسک) به عنوان شرط خاتمه منتظر میماند. تنها برای نوشتن ترتیبی منطقی است. برای بار کاری خواندن، ابتدا نقطه اتصال (mount point) پر شده و سپس I/O روی نتیجه آغاز میشود.
موتور I/O (I/O engine)
- ioengine=str
- برنامه fio از
۲ نوع
اندازهگیری
کارایی
پشتیبانی
میکند:
عملیات I/O و
عملیات
فایل/دایرکتوری.
موتورهای I/O نحوه صدور درخواست I/O به فایل را توسط کار مشخص میکنند. انواع زیر تعریف شدهاند:
- sync
- عملیات I/O پایه با read(2) یا write(2). از lseek(2) برای تعیین موقعیت I/O استفاده میشود. برای همگامسازی I/Oهای نوشتن، به fsync و fdatasync مراجعه کنید.
- psync
- عملیات I/O پایه با pread(2) یا pwrite(2). پیشفرض در تمام سیستمعاملهای پشتیبانیشده به جز Windows.
- vsync
- عملیات I/O پایه با readv(2) یا writev(2). صفبندی را با ادغام (coalescing) I/Oهای مجاور در یک ارسال واحد شبیهسازی میکند.
- pvsync
- عملیات I/O پایه با preadv(2) یا pwritev(2).
- pvsync2
- عملیات I/O پایه با preadv2(2) یا pwritev2(2).
- io_uring
- ورودی/خروجی ناهمگام بومی و سریع لینوکس. از I/O ناهمگام هم برای direct IO و هم برای buffered IO پشتیبانی میکند. این موتور گزینههای مختص به خود را تعریف میکند.
- io_uring_cmd
- ورودی/خروجی ناهمگام بومی و سریع لینوکس برای دستورهای passthrough. این موتور گزینههای مختص به خود را تعریف میکند.
- libaio
- ورودی/خروجی ناهمگام بومی لینوکس. توجه داشته باشید که لینوکس ممکن است رفتار صفبندیشده را تنها برای I/O غیربافری پشتیبانی کند (`direct=1' یا `buffered=0' را تنظیم کنید). این موتور گزینههای مختص به خود را تعریف میکند.
- posixaio
- ورودی/خروجی ناهمگام POSIX با استفاده از aio_read(3) و aio_write(3).
- solarisaio
- ورودی/خروجی ناهمگام بومی Solaris.
- windowsaio
- ورودی/خروجی ناهمگام بومی Windows. پیشفرض در Windows.
- mmap
- فایل با استفاده از mmap(2) در حافظه نگاشت شده و دادهها با استفاده از memcpy(3) کپی/خوانده میشوند.
- splice
- از splice(2) برای انتقال داده و از vmsplice(2) برای انتقال داده از فضای کاربری به هسته استفاده میشود.
- sg
- ورودی/خروجی عمومی SCSI نگارش 3 (sg v3). میتواند با استفاده از SG_IO ioctl همگام باشد، یا اگر هدف یک دستگاه نویسهای sg باشد، از read(2) و write(2) برای I/O ناهمگام استفاده میکند. برای تعیین دستگاههای بلوکی یا نویسهای به گزینه filename نیاز دارد. این موتور از عملیات trim پشتیبانی میکند. موتور sg شامل گزینههای مختص به خود است.
- libzbc
- عملیات خواندن، نوشتن، trim و ZBC/ZAC روی دستگاه بلوکی زونبندیشده با استفاده از کتابخانه libzbc. هدف میتواند یک دستگاه نویسهای SG یا یک فایل دستگاه بلوکی باشد.
- null
- هیچ دادهای را انتقال نمیدهد، بلکه تنها وانمود به انتقال میکند. عمدتاً برای بهکارگیری خود fio و برای اهداف اشکالزدایی/آزمایش استفاده میشود.
- net
- انتقال بر بستر شبکه به `host:port' مشخصشده. بسته به protocol استفادهشده، گزینههای hostname، port، listen و filename برای تعیین نوع اتصالی که باید برقرار شود به کار میروند، در حالی که گزینه protocol پروتکل مورد استفاده را مشخص میکند. این موتور گزینههای مختص به خود را تعریف میکند.
- netsplice
- مشابه net، اما از splice(2) و vmsplice(2) برای نگاشت داده و ارسال/دریافت استفاده میکند. این موتور گزینههای مختص به خود را تعریف میکند.
- cpuio
- هیچ دادهای را انتقال نمیدهد، اما چرخههای CPU را بر اساس گزینههای cpuload، cpuchunks و cpumode مصرف میکند. یک کار هرگز پایان نمییابد مگر اینکه حداقل یک کار غیر-cpuio وجود داشته باشد.
cpuload=85 باعث میشود که کار هیچ کاری جز سوزاندن ۸۵٪ از CPU انجام ندهد. در ماشینهای SMP، از numjobs=<nr_of_cpu> برای دستیابی به مصرف مورد نظر پردازنده استفاده کنید، زیرا cpuload تنها یک پردازنده واحد را با نرخ مورد نظر بارگذاری میکند.
cpumode=qsort حلقه دستورات پیشفرض noop را با الگوریتم qsort جایگزین میکند تا انرژی بیشتری مصرف شود.
- rdma
- موتور I/O از نوع RDMA هم از معناشناسی حافظه RDMA (یعنی RDMA_WRITE/RDMA_READ) و هم از معناشناسی کانال (Send/Recv) برای پروتکلهای InfiniBand، RoCE و iWARP پشتیبانی میکند. این موتور گزینههای مختص به خود را تعریف میکند.
- falloc
- موتور I/O که دستور معمولی fallocate را برای شبیهسازی انتقال داده به عنوان ioengine در fio انجام میدهد.
DDIR_READ fallocate(,mode = FALLOC_FL_KEEP_SIZE,) را اجرا میکند.
DIR_WRITE fallocate(,mode = 0) را اجرا میکند.
DDIR_TRIM fallocate(,mode = FALLOC_FL_KEEP_SIZE|FALLOC_FL_PUNCH_HOLE) را اجرا میکند. ftruncate موتور I/O که در پاسخ به رویدادهای نوشتن (DDIR_WRITE)، عملیاتهای ftruncate(2) را ارسال میکند. هر ftruncate صادر شده، اندازه فایل را روی آفست بلوک جاری تنظیم میکند. مقدار blocksize نادیده گرفته میشود.
- e4defrag
- موتور I/O که ioctlهای معمولی EXT4_IOC_MOVE_EXT را برای شبیهسازی فعالیت یکپارچهسازی دیسک (defragment) در پاسخ به رویداد DDIR_WRITE انجام میدهد.
- rados
- موتور I/O با پشتیبانی از دسترسی مستقیم به Ceph Reliable Autonomic Distributed Object Store (RADOS) از طریق librados. این ioengine گزینههای مختص به خود را تعریف میکند.
- rbd
- موتور I/O با پشتیبانی از دسترسی مستقیم به Ceph Rados Block Devices (RBD) از طریق librbd بدون نیاز به استفاده از درایور rbd هسته. این ioengine گزینههای مختص به خود را تعریف میکند.
- http
- موتور I/O با
پشتیبانی
از
درخواستهای
GET/PUT روی HTTP(S) با
استفاده از
libcurl به یک نقطه
پایانی WebDAV یا
S3. این ioengine
گزینههای
مختص به خود
را تعریف
میکند.
این موتور تنها از I/O مستقیم با iodepth=1 پشتیبانی میکند؛ باید این مورد را از طریق numjobs مقیاسبندی کنید. مقدار blocksize اندازه اشیاء ایجاد شونده را مشخص میکند.
دستور TRIM به حذف شیء ترجمه میشود.
- gfapi
- استفاده از رابط همگام libgfapi در GlusterFS برای دسترسی مستقیم به حجمهای ذخیرهسازی GlusterFS بدون نیاز به گذر از FUSE. این ioengine گزینههای مختص به خود را تعریف میکند.
- gfapi_async
- استفاده از رابط ناهمگام libgfapi در GlusterFS برای دسترسی مستقیم به حجمهای ذخیرهسازی GlusterFS بدون نیاز به گذر از FUSE. این ioengine گزینههای مختص به خود را تعریف میکند.
- libhdfs
- خواندن و نوشتن از طریق Hadoop (HDFS). گزینه filename برای مشخص کردن host,port مربوط به name-node در hdfs جهت اتصال استفاده میشود. این موتور آفستها را کمی متفاوت تفسیر میکند. در HDFS، فایلها پس از ایجاد قابل تغییر نیستند، بنابراین نوشتن تصادفی امکانپذیر نیست. برای شبیهسازی این موضوع، موتور libhdfs انتظار دارد مجموعهای از فایلهای کوچک روی HDFS ایجاد شوند و به طور تصادفی فایلی را از میان آنها بر اساس آفست ایجاد شده توسط بکاند fio انتخاب میکند (برای ایجاد چنین فایلهایی، فایل job نمونه را ببینید، از گزینه `rw=write' استفاده کنید). لطفاً توجه داشته باشید که ممکن است برای کارکرد صحیح با HDFS/libhdfs، تنظیم متغیرهای محیطی لازم باشد. هر job از اتصال اختصاصی خود به HDFS استفاده میکند.
- mtd
- خواندن، نوشتن و پاک کردن دستگاه نویسهای MTD (مانند `/dev/mtd0'). عملیاتهای discard به عنوان erase در نظر گرفته میشوند. بسته به نوع دستگاه زیربنایی، ممکن است لازم باشد I/O طبق الگوی خاصی انجام شود؛ برای مثال، در NAND، نوشتن ترتیبی در بلوکهای erase و انجام discard قبل از بازنویسی (overwriting). حالت trimwrite برای این محدودیت به خوبی عمل میکند.
- dev-dax
- خواندن و نوشتن با استفاده از device DAX روی یک دستگاه حافظه پایدار (مانند /dev/dax0.0) از طریق کتابخانه PMDK libpmem.
- external
- پیشوندی برای مشخص کردن بارگذاری یک فایل شیء (object file) از موتور I/O خارجی. نام فایل موتور را پیوست کنید، برای مثال `ioengine=external:/tmp/foo.o' جهت بارگذاری ioengine با نام `foo.o' در پوشه `/tmp'. مسیر میتواند مطلق یا نسبی باشد. برای جزئیات نوشتن یک موتور I/O خارجی، فایل `engines/skeleton_external.c' را در سورس fio ببینید.
- libpmem
- خواندن و نوشتن با استفاده از mmap I/O روی فایلی در یک سیستمفایل سوارشده (mounted) با DAX روی یک دستگاه حافظه پایدار از طریق کتابخانه PMDK libpmem.
- ime_psync
- خواندن و نوشتن همگام با استفاده از Infinite Memory Engine (IME) متعلق به DDN. این موتور بسیار ابتدایی است و هر زمان که یک IO در صف قرار گیرد، فراخوانیهایی را به IME صادر میکند.
- ime_psyncv
- خواندن و نوشتن همگام با استفاده از Infinite Memory Engine (IME) متعلق به DDN. این موتور از iovecها استفاده کرده و پیش از صدور فراخوانی به IME، تلاش میکند تا جای ممکن عملیاتهای IO را روی هم انباشته کند (اگر IOها «پیوسته» باشند و از عمق IO فراتر نرود).
- ime_aio
- خواندن و نوشتن ناهمگام با استفاده از Infinite Memory Engine (IME) متعلق به DDN. این موتور تلاش میکند با ایجاد درخواستها برای IME، تا حد ممکن عملیاتهای IO را روی هم انباشته کند. سپس FIO تصمیم میگیرد که چه زمانی این درخواستها ثبت (commit) شوند.
- libiscsi
- خواندن و نوشتن iscsi lun با استفاده از libiscsi.
- nbd
- خواندن و نوشتن همگام در یک Network Block Device (NBD).
- libcufile
- موتور I/O با پشتیبانی از دسترسی همگام libcufile به nvidia-fs و یک سیستمفایل با پشتیبانی از GPUDirect Storage. این موتور I/O را بدون انتقال بافرها بین فضای کاربری و هسته انجام میدهد، مگر اینکه verify تنظیم شده باشد یا cuda_io برابر با posix باشد. مقدار iomem نباید cudamalloc باشد. این ioengine گزینههای مختص به خود را تعریف میکند.
- dfs
- موتور I/O با پشتیبانی از عملیاتهای خواندن و نوشتن ناهمگام در DAOS File System (DFS) از طریق libdfs.
- nfs
- موتور I/O با پشتیبانی از عملیاتهای خواندن و نوشتن ناهمگام در سیستمفایلهای NFS از فضای کاربری از طریق libnfs. این ویژگی برای دستیابی به همزمانی بیشتر و در نتیجه توان عملیاتی (throughput) بالاتر نسبت به NFS هسته مفید است.
- exec
- اجرای ابزارهای شخص ثالث (3rd party). میتواند برای انجام پایش در حین اجرای jobها استفاده شود.
- xnvme
- موتور I/O با استفاده از API زبان C مربوط به xNVMe، برای دستگاههای NVMe. موتور xnvme انعطافپذیری لازم را جهت دسترسی به درایور NVMe هسته GNU/Linux از طریق libaio، فراخوانیهای IOCTL، io_uring، درایور NVMe مربوط به SPDK، یا درایور سفارشی شما فراهم میکند. موتور xnvme شامل گزینههای اختصاصی این موتور است. (ببینید: https://xnvme.io).
- libblkio
- استفاده از کتابخانه libblkio (https://gitlab.com/libblkio/libblkio). درایور خاص مورد استفاده باید با libblkio_driver تنظیم شود. اگر mem/iomem مشخص نشده باشد، تخصیص حافظه به libblkio واگذار میشود (و در نتیجه کارکرد آن با درایور انتخابشده تضمین میشود). برای هر فرایند از یک نمونه libblkio استفاده میشود، بنابراین تمام jobهایی که گزینه thread را تنظیم کردهاند یک نمونه مشترک خواهند داشت (با یک صف به ازای هر thread) و باید گزینههای سازگار را مشخص کنند. توجه داشته باشید که برخی از درایورها اجازه دسترسی همزمان چندین نمونه به همان دستگاه یا فایل را نمیدهند، اما این کار را برای threadها مجاز میدانند.
موتورهای عملیات فایل/دایرکتوری نحوه کارکرد job روی فایل یا دایرکتوری را مشخص میکنند. انواع زیر تعریف شدهاند:
- filecreate
- صرفاً ایجاد فایلها بدون انجام هیچگونه I/O روی آنها. هنوز نیاز است که filesize را تنظیم کنید تا تمام محاسبات آماری انجام شود، اما به جز ایجاد فایل هیچ I/O واقعی انجام نخواهد شد. فایل job نمونه: filecreate-ioengine.fio.
- filestat
- صرفاً اجرای stat() بدون انجام هیچ I/O روی فایل. باید filesize و nrfiles را تنظیم کنید تا فایلها ایجاد شوند. این موتور برای سنجش جستجوی فایل و دسترسی به فراداده (metadata) است. فایل job نمونه: filestat-ioengine.fio.
- filedelete
- صرفاً حذف فایلها با unlink() بدون انجام I/O روی آنها. باید filesize و nrfiles را تنظیم کنید تا فایلها ایجاد شوند. این موتور برای سنجش حذف فایل است. فایل job نمونه: filedelete-ioengine.fio.
- dircreate
- صرفاً ایجاد دایرکتوریها بدون انجام هیچگونه I/O روی آنها. هنوز نیاز است که filesize را تنظیم کنید تا تمام محاسبات آماری انجام شود، اما به جز ایجاد دایرکتوریها هیچ I/O واقعی انجام نخواهد شد. فایل job نمونه: dircreate-ioengine.fio.
- dirstat
- صرفاً اجرای stat() بدون انجام I/O روی دایرکتوریها. باید filesize و nrfiles را تنظیم کنید تا دایرکتوریها ایجاد شوند. این موتور برای سنجش جستجوی دایرکتوری و دسترسی به فراداده (metadata) است. فایل job نمونه: dirstat-ioengine.fio.
- dirdelete
- صرفاً حذف دایرکتوریها با rmdir() بدون انجام I/O روی آنها. باید filesize و nrfiles را تنظیم کنید تا دایرکتوریها ایجاد شوند. این موتور برای سنجش حذف دایرکتوری است.
برای موتورهای عملیات فایل و دایرکتوری، هیچ توان عملیاتی I/O وجود ندارد، بنابراین دادههای آماری در گزارش معانی متفاوتی دارند. شاخصهای خروجی معنادار عبارتند از: iops و clat. مقدار bw بیمعنی است. برای جزئیات بیشتر به بخش «Interpreting the output» مراجعه کنید. علاوه بر این، پارامترهایی وجود دارند که تنها هنگام استفاده از یک ioengine خاص معتبر هستند. اینها همانند پارامترهای عادی استفاده میشوند، با این هشدار که هنگام استفاده در خط فرمان، باید پس از انتخاب ioengine تعریفکنندهشان قرار گیرند.
- (io_uring,libaio)cmdprio_percentage=int[,int]
- درصد I/Oهایی که با بالاترین اولویت صادر میشوند را تعیین میکند. پیشفرض: 0. یک مقدار منفرد برای خواندنها و نوشتنها اعمال میشود. مقادیر جداشده با کاما میتوانند برای خواندنها و نوشتنها مشخص شوند. برای اثربخش بودن این گزینه، اولویت NCQ باید پشتیبانی و فعال شده باشد، و گزینه `direct=1' باید استفاده شود. همچنین fio باید به عنوان کاربر root اجرا گردد. برخلاف آمارهای slat/clat/lat که میتوانند بهطور مستقل ردیابی و گزارش شوند، آمارهای به ازای هر اولویت تنها یک نوع تاخیر را ردیابی و گزارش میکنند. بهطور پیشفرض، تاخیر تکمیل (clat) گزارش خواهد شد؛ اگر lat_percentiles تنظیم شده باشد، تاخیر کل (lat) گزارش خواهد شد.
- (io_uring,libaio)cmdprio_class=int[,int]
- کلاس اولویت I/O را برای I/Oهایی که هنگام تنظیم cmdprio_percentage یا cmdprio_bssplit باید با اولویت صادر شوند، تعیین میکند. اگر هنگام تنظیم cmdprio_percentage یا cmdprio_bssplit مشخص نشود، پیشفرض بالاترین کلاس اولویت است. یک مقدار منفرد برای خواندنها و نوشتنها اعمال میشود. مقادیر جداشده با کاما میتوانند برای خواندنها و نوشتنها مشخص شوند. به صفحه راهنمای ionice(1) مراجعه کنید. همچنین گزینه prioclass را ببینید.
- (io_uring,libaio)cmdprio_hint=int[,int]
- نشانه اولویت I/O (priority hint) را برای I/Oهایی که هنگام تنظیم cmdprio_percentage یا cmdprio_bssplit باید با اولویت صادر شوند، تعیین میکند. اگر هنگام تنظیم cmdprio_percentage یا cmdprio_bssplit مشخص نشود، پیشفرض 0 (بدون نشانه) است. یک مقدار منفرد برای خواندنها و نوشتنها اعمال میشود. مقادیر جداشده با کاما میتوانند برای خواندنها و نوشتنها مشخص شوند. همچنین گزینه priohint را ببینید.
- (io_uring,libaio)cmdprio=int[,int]
- مقدار اولویت I/O را برای I/Oهایی که هنگام تنظیم cmdprio_percentage یا cmdprio_bssplit باید با اولویت صادر شوند، تعیین میکند. اگر هنگام تنظیم cmdprio_percentage یا cmdprio_bssplit مشخص نشود، پیشفرض 0 است. لینوکس ما را به یک مقدار مثبت بین 0 تا 7 محدود میکند که 0 بالاترین اولویت است. یک مقدار منفرد برای خواندنها و نوشتنها اعمال میشود. مقادیر جداشده با کاما میتوانند برای خواندنها و نوشتنها مشخص شوند. به صفحه راهنمای ionice(1) مراجعه کنید. برای سایر سیستمعاملها به صفحه راهنمای مناسب رجوع کنید زیرا ممکن است معنای اولویت متفاوت باشد. همچنین گزینه prio را ببینید.
- (io_uring,libaio)cmdprio_bssplit=str[,str]
- برای داشتن کنترل دقیقتر بر روی اولویت I/O، این گزینه امکان تعیین درصد I/Oهایی را فراهم میکند که بسته به اندازه بلوک (block size) ورودی/خروجی باید دارای اولویت باشند. این گزینه تنها زمانی مفید است که همراه با گزینه bssplit استفاده شود، یعنی زمانی که چندین اندازه بلوک مختلف برای خواندنها و نوشتنها استفاده میشود.
نخستین قالب پذیرفتهشده برای این گزینه همانند قالب گزینه bssplit است:
cmdprio_bssplit=blocksize/percentage:blocksize/percentage
در این حالت، هر ورودی بهترتیب از کلاس اولویت، نشانه اولویت و سطح اولویت تعریفشده توسط گزینههای cmdprio_class، cmdprio و cmdprio_hint استفاده خواهد کرد.
دومین قالب پذیرفتهشده برای این گزینه عبارت است از:
cmdprio_bssplit=blocksize/percentage/class/level:blocksize/percentage/class/level
در این حالت، کلاس اولویت و سطح اولویت در داخل هر ورودی تعریف میشود. در مقایسه با نخستین قالب، قالب دوم محدود نمیکند که همه ورودیها کلاس اولویت و سطح اولویت یکسانی داشته باشند.
سومین قالب پذیرفتهشده برای این گزینه عبارت است از:
cmdprio_bssplit=blocksize/percentage/class/level/hint:...
این توسعهای از قالب دوم است که امکان تعیین یک نشانه اولویت (priority hint) را نیز فراهم میکند.
برای تمام قالبها، تنها جهتهای دادهای خواندن و نوشتن پشتیبانی میشوند و مقادیر مربوط به I/Oهای trim نادیده گرفته میشوند. این گزینه با گزینه cmdprio_percentage مانعةالجمع است و نمیتوانند همزمان استفاده شوند.
- (io_uring,io_uring_cmd)fixedbufs
- اگر از fio خواسته شود I/O مستقیم (direct IO) انجام دهد، لینوکس برای هر فراخوانی IO صفحهها را نگاشت (map) میکند و پس از اتمام IO آنها را آزاد میسازد. اگر این گزینه تنظیم شود، صفحهها پیش از شروع IO از پیش نگاشت میشوند. این کار نیاز به نگاشت و آزادسازی برای هر IO را از بین میبرد. این روش کارآمدتر بوده و تاخیر IO را نیز کاهش میدهد.
- (io_uring,io_uring_cmd)nonvectored=int
- با این گزینه، fio از دستورهای خواندن/نوشتن غیربرداری (non-vectored) استفاده میکند که در آنها آدرس باید مستقیماً حاوی نشانی باشد. پیشفرض -1 است.
- (io_uring,io_uring_cmd)force_async
- عملکرد عادی io_uring به این صورت است که ابتدا تلاش میکند یک sqe را بهصورت غیرمسدودکننده (non-blocking) صادر کند، و در صورت شکست، آن را بهشیوه ناهمگام (async) اجرا نماید. با تنظیم این گزینه بر روی N، در هر N درخواست fio تقاضا میکند که sqe بهشیوه ناهمگام صادر شود. پیشفرض 0 است.
- (io_uring,io_uring_cmd,xnvme)hipri
- اگر این گزینه تنظیم شود، fio تلاش خواهد کرد از تکمیلهای پایششده ورودی/خروجی (polled IO completions) استفاده کند. تکمیلهای عادی IO برای اعلام اتمام وقفه (interrupt) ایجاد میکنند، در حالی که تکمیلهای پایششده چنین نیستند؛ بنابراین نیازمند جمعآوری فعال (active reaping) توسط برنامه هستند. مزایای آن، IO کارآمدتر برای سناریوهای با IOPS بالا و تاخیر کمتر برای IO با عمق صف پایین است.
- (io_uring,io_uring_cmd)registerfiles
- با این گزینه، fio مجموعه فایلهای در حال استفاده را نزد هسته ثبت میکند. این امر از بار اضافی مدیریت تعداد فایلها در هسته جلوگیری کرده و بخش ارسال (submission) و تکمیل (completion) را سبکتر میسازد. برای گزینه sqthread_poll در زیر الزامی است.
- (io_uring,io_uring_cmd,xnvme)sqthread_poll
- بهطور معمول fio ورودی/خروجی را با صدور یک فراخوانی سیستمی ارسال میکند تا هسته را از آیتمهای موجود در حلقه SQ مطلع سازد. اگر این گزینه تنظیم شود، عمل ارسال IO توسط یک ریسه پایش (polling thread) در هسته انجام خواهد شد. این کار چرخههای پردازشی را برای fio آزاد میکند، اما به بهای مصرف CPU بیشتر در سیستم تمام میشود. از آنجا که ارسال تنها شامل زمان لازم برای پر کردن ورودیهای sqe و هر فراخوانی سیستمی مورد نیاز برای بیدار کردن ریسه غیرفعال هسته است، fio تاخیرهای ارسال (submission latencies) را گزارش نخواهد کرد.
- (io_uring,io_uring_cmd)sqthread_poll_cpu=int
- هنگامی که `sqthread_poll` تنظیم شده باشد، این گزینه روشی برای تعیین این که کدام CPU باید برای ریسه پایش استفاده شود فراهم میکند.
- (io_uring_cmd)cmd_type=str
- نوع دستور uring passthrough را برای استفاده مشخص میکند. مقدار پشتیبانیشده nvme است. پیشفرض nvme است.
- (libaio)userspace_reap
- بهطور عادی، هنگام استفاده از موتور libaio، برنامه fio از فراخوانی سیستمی io_getevents(3) برای جمعآوری رویدادهای بازگشتی جدید استفاده میکند. با روشن بودن این پرچم، حلقه AIO مستقیماً از فضای کاربری برای جمعآوری رویدادها خوانده میشود. حالت جمعآوری تنها زمانی فعال میشود که پایش حداقل برای 0 رویداد صورت گیرد (مثلاً هنگامی که `iodepth_batch_complete=0`).
- (pvsync2)hipri
- پرچم RWF_HIPRI را بر روی I/O تنظیم میکند، که به هسته نشان میدهد این عملیات دارای اولویتی بالاتر از حالت عادی است.
- (pvsync2)hipri_percentage
- هنگامی که hipri تنظیم شده باشد، این گزینه احتمال اولویتبالا بودن یک I/O در pvsync2 را تعیین میکند. پیشفرض 100% است.
- (pvsync2,libaio,io_uring,io_uring_cmd)nowait=bool
- بهطور
پیشفرض
اگر
درخواستی
نتواند
بلافاصله
اجرا شود
(مثلاً
کمبود
منابع یا
انتظار روی
قفلها)، در
صف قرار
میگیرد و
فرایند
آغازگر تا
زمان آزاد
شدن منبع
مورد نیاز
مسدود
خواهد شد.
این گزینه
پرچم RWF_NOWAIT را
تنظیم
میکند (از
هسته
لینوکس 4.14
پشتیبانی
میشود) و
فراخوانی
به جای معطل
ماندن،
فوراً با EAGAIN
یا یک نتیجه
جزئی
بازمیگردد.
استفاده از ignore_error=EAGAIN نیز همراه با این گزینه مفید است. نکته: در بستهبندهای فراخوانی سیستمی preadv2 و pwritev2 در glibc نسخههای 2.27 و 2.28 یک باگ وجود دارد که به جای EAGAIN مقدار EOPNOTSUP را بازمیگردانند.
برای I/Oهای دارای حافظه نهان (cached I/O)، استفاده از این گزینه معمولاً به این معنی است که یک درخواست تنها با دادههای حافظهنهانشده کار میکند. در حال حاضر پرچم RWF_NOWAIT برای نوشتن حافظهنهانشده پشتیبانی نمیشود. برای I/O مستقیم، درخواستها تنها در صورتی موفق خواهند شد که ابطال حافظه نهان لازم نباشد، بلوکهای فایل بهطور کامل تخصیص یافته باشند و درخواست دیسک بتواند فوراً صادر شود.
- (pvsync2,io_uring)uncached=int
- این گزینه I/O
بافتری را
بدون
نگهداشتن
دادهها در
حافظه نهان
صفحه (page cache) پس
از پایان
عملیات،
انجام
میدهد.
خواندنها مانند یک خواندن بافتری معمولی کار میکنند، اما صفحهها بلافاصله پس از کپی دادهها به فضای کاربری کنار گذاشته (evict) میشوند. نوشتنها مانند نوشتن بافتری عمل میکنند اما یک writeback پیش از بازگشت فراخوانی سیستمی آغاز میشود. پس از اتمام writeback، صفحهها بیرون رانده میشوند.
این گزینه پرچم RWF_UNCACHED را (از هسته لینوکس 6.14 پشتیبانی میشود) بر پایه هر I/O تنظیم میکند.
- (pvsync2,libaio,io_uring)atomic=bool
- این گزینه
بدین
معناست که
نوشتنها
با حفاظت در
برابر
نوشتن
تکهتکه (torn-write
protection) صادر
میشوند؛
بدین مفهوم
که در صورت
قطع برق یا
از کار
افتادن
هسته، تمام
دادههای
نوشتن
ذخیره
میشوند یا
هیچکدام،
و هرگز
ترکیبی از
دادههای
قدیم و جدید
نخواهد بود.
حفاظت torn-write با
نام
نوشتنهای
اتمی (atomic writes) نیز
شناخته
میشود.
این گزینه پرچم RWF_ATOMIC را (از هسته لینوکس 6.11 پشتیبانی میشود) بر پایه هر I/O تنظیم میکند.
نوشتنهایی که RWF_ATOMIC در آنها تنظیم شده است، در صورتی که فایل از حفاظت torn-write پشتیبانی نکند توسط هسته رد خواهند شد. برای اطلاع از محدودیتهای torn-write یک فایل، دستور statx را با STATX_WRITE_ATOMIC اجرا کنید.
- (io_uring_cmd,xnvme)fdp=bool
- فعالسازی حالت Flexible Data Placement برای دستورهای نوشتن.
- (io_uring_cmd,xnvme)dataplacement=str
- نوع دستورالعمل data placement را برای استفاده در دستورهای نوشتن مشخص میکند. انواع زیر پشتیبانی میشوند:
- (io_uring_cmd,xnvme)plid_select=str,fdp_pli_select=str
- تعیین میکند که fio چگونه تصمیم میگیرد کدام شناسهٔ جایگذاری (placement ID) را در نوبت بعدی به کار ببرد. انواع زیر تعریف شدهاند:
- random
- انتخاب یک شناسهٔ جایگذاری (placement ID) بهصورت تصادفی (یکنواخت).
- roundrobin
- چرخش نوبتی (Round robin) بین شناسههای جایگذاری موجود. این مقدار پیشفرض است.
- scheme
- انتخاب یک شناسهٔ جایگذاری (اندیس) بر اساس فایل طرحوارهٔ تعریفشده توسط گزینهٔ dp_scheme.
شناسههای (اندیسهای) جایگذاری موجود بهوسیلهٔ گزینهٔ plids یا fdp_pli تعریف میشوند، مگر در حالت scheme.
- (io_uring_cmd,xnvme)plids=str,fdp_pli=str
- مشخص
میکند که
این کار (job)
مجاز به
استفاده از
کدام
اندیسهای
شناسهٔ
جایگذاری
(FDP) یا
شناسههای
جایگذاری
(streams) برای
نوشتن است.
این گزینه
فهرستی از
مقادیر یا
محدودههای
جداشده با
کاما را
میپذیرد
(برای نمونه
1,2-4,5,6-8).
برای FDP بهطور پیشفرض، کار در میان تمام شناسههای جایگذاری موجود گردش میکند، بنابراین از این گزینه برای انتخاب موردی استفاده کنید. مقادیر مشخصشده در اینجا، اندیسهای آرایه برای فهرست شناسههای جایگذاری بازگرداندهشده توسط دستور nvme-cli یعنی `nvme fdp status' هستند. اگر میخواهید fio فقط از شناسههای جایگذاری FDP در اندیسهای 0، 2 و 5 استفاده کند، `plids=0,2,5' را تنظیم کنید.
برای streams این باید فهرستی از Stream IDها باشد.
- (io_uring_cmd,xnvme)dp_scheme=str
- تعیین میکند کدام شناسهٔ جایگذاری (اندیس) بر اساس محدودهٔ آفست (LBA) انتخاب شود. فایل باید شامل یک یا چند مدخل طرحواره در قالب زیر باشد:
10737418240, 21474836480, 1
21474836480, 32212254720, 2
...
هر خط به عنوان یک مدخل طرحواره، شامل آفست شروع، آفست پایان و شناسهٔ جایگذاری (اندیس) است که با کاما (,) جدا شدهاند. اگر آفست نوشتن در محدودهٔ یک مدخل طرحوارهٔ خاص باشد (start offset ≤ offset < end offset)، شناسهٔ جایگذاری (اندیس) متناظر انتخاب خواهد شد. اگر آفست نوشتن متعلق به چند مدخل طرحواره باشد، اولین مدخل منطبق اعمال میشود. اگر آفست در هیچ محدودهای از مدخلهای طرحواره نباشد، فیلد dspec روی 0، یعنی RUH پیشفرض تنظیم خواهد شد. (احتیاط: در صورت وجود چند دستگاه در یک کار، تمام دستگاههای آن کار تحت تأثیر طرحواره قرار خواهند گرفت. در صورت مشخص شدن این گزینه، گزینهٔ plids یا fdp_pli نادیده گرفته خواهد شد.)
- (io_uring_cmd,xnvme)md_per_io_size=int
- اندازه بر حسب بایت برای بافر فرادادهٔ جداگانه به ازای هر IO. برای io_uring_cmd این بافرها بدون توجه به مقدار تنظیمشده برای iomem، با استفاده از malloc تخصیص مییابند. پیشفرض: 0.
- (io_uring_cmd,xnvme)pi_act=int
- عملیاتی که
در صورت
قالببندی
فضاینام nvme
با اطلاعات
محافظت (protection information)
انجام
میشود. اگر
روی 1 تنظیم
شود و
فضاینام
با اندازهٔ
فراداده
برابر با
اندازهٔ
اطلاعات
محافظت
قالببندی
شده باشد، fio
از بافر
فرادادهٔ
جداگانه یا
بلوک منطقی
گسترشیافته
استفاده
نخواهد کرد.
اگر روی 1
تنظیم شود و
فضاینام
با اندازهٔ
فراداده
بزرگتر از
اندازهٔ
اطلاعات
محافظت
قالببندی
شده باشد، fio
بخش
اطلاعات
محافظت از
فراداده را
به ترتیب
برای
عملیات
نوشتن یا
خواندن
تولید یا
اعتبارسنجی
نخواهد کرد.
اگر روی 0
تنظیم شود،
fio اطلاعات
محافظت را
برای حالت
نوشتن
تولید و
برای حالت
خواندن
اعتبارسنجی
میکند.
پیشفرض: 1.
برای تولید CRC شانزده بیتی (16 bit)، در صورت موجود بودن، fio از isa-l استفاده میکند؛ در غیر این صورت از تولیدکنندهٔ پیشفرض با سرعت کمتر استفاده خواهد شد. (ببینید: https://github.com/intel/isa-l)
- (io_uring_cmd,xnvme)pi_chk=str[,str][,str]
- بررسی اطلاعات محافظت را کنترل میکند. این گزینه میتواند یک یا چند مورد از این مقادیر را بپذیرد. پیشفرض: none.
- (io_uring_cmd,xnvme)apptag=int
- در صورتی که فضاینام برای استفاده از اطلاعات محافظت سرتاسری قالببندی شده باشد، مقدار برچسب برنامهٔ (application tag) بلوک منطقی را مشخص میکند. پیشفرض: 0x1234.
- (io_uring_cmd,xnvme)apptag_mask=int
- در صورتی که فضاینام برای استفاده از اطلاعات محافظت سرتاسری قالببندی شده باشد، مقدار ماسک برچسب برنامهٔ (application tag mask) بلوک منطقی را مشخص میکند. پیشفرض: 0xffff.
- (io_uring_cmd)num_range=int
- برای دستور trim، این مقدار تعداد محدودههایی خواهد بود که در هر درخواست I/O تریم میشوند. تعداد بلوکهای منطقی در هر محدوده توسط گزینهٔ bs تعیین میشود که باید مضربی از اندازهٔ بلوک منطقی باشد. این گزینه همراه با خواندن یا نوشتن قابل استفاده نیست. توجه داشته باشید که با تنظیم این گزینه بزرگتر از 1 (> 1)، گزینهٔ log_offset قادر به ثبت تمام آفستها نخواهد بود. پیشفرض: 1.
- (cpuio)cpuload=int
- تلاش برای استفاده از درصد مشخصشدهای از چرخههای CPU. این گزینه هنگام استفاده از موتور ورودی/خروجی cpuio اجباری است.
- (cpuio)cpuchunks=int
- تقسیم بار کاری به چرخههایی با مدتزمان دادهشده. بر حسب میکروثانیه.
- (cpuio)cpumode=str
- نحوهٔ اعمال بار کاری به CPU را مشخص میکند. میتواند این دو مقدار را بپذیرد:
- (cpuio)exit_on_io_done=bool
- تشخیص زمان اتمام نخهای I/O و سپس خروج.
- (libhdfs)namenode=str
- نام میزبان (hostname) یا نشانی IP مربوط به namenode خوشهٔ HDFS جهت برقراری ارتباط.
- (libhdfs)port=int
- درگاه شنود namenode خوشهٔ HDFS.
- (netsplice,net)port=int
- درگاه TCP یا UDP برای bind شدن یا اتصال به آن. اگر این گزینه همراه با numjobs برای ایجاد چندین نمونه از یک نوع کار استفاده شود، این درگاه به عنوان شماره درگاه شروع خواهد بود زیرا fio از محدودهای از درگاهها استفاده خواهد کرد.
- (rdma)port=int
- درگاه مورد استفاده برای ارتباط RDMA-CM. این مقدار باید در سمت کارخواه (client) و کارساز (server) یکسان باشد.
- (netsplice,net,rdma)hostname=str
- نام میزبان یا نشانی IP مورد استفاده برای I/O مبتنی بر TCP، UDP یا RDMA-CM. اگر کار یک شنوندهٔ TCP یا خوانندهٔ UDP باشد، hostname استفاده نمیشود و باید حذف شود مگر اینکه یک نشانی معتبر چندپخشی (multicast) در UDP باشد.
- (netsplice,net)interface=str
- نشانی IP رابط شبکه که برای ارسال یا دریافت چندپخشی UDP استفاده میشود.
- (netsplice,net)ttl=int
- مقدار Time-to-live برای بستههای چندپخشی خروجی UDP. پیشفرض: 1.
- (netsplice,net)nodelay=bool
- تنظیم TCP_NODELAY روی اتصالهای TCP.
- (netsplice,net)protocol=str, proto=str
- پروتکل شبکه برای استفاده. مقادیر پذیرفتهشده عبارتند از:
- tcp
- پروتکل کنترل انتقال (Transmission control protocol).
- tcpv6
- پروتکل کنترل انتقال نسخهٔ ۶ (Transmission control protocol V6).
- udp
- پروتکل بستهدادهٔ کاربر (User datagram protocol).
- udpv6
- پروتکل بستهدادهٔ کاربر نسخهٔ ۶ (User datagram protocol V6).
- unix
- سوکت دامنهٔ یونیکس (UNIX domain socket).
- vsock
- پروتکل VSOCK.
هنگامی که پروتکل TCP، UDP یا VSOCK باشد، درگاه (port) نیز باید ارائه شود؛ همچنین اگر کار یک شنوندهٔ TCP یا VSOCK یا یک خوانندهٔ UDP باشد، hostname نیز باید داده شود. برای سوکتهای unix، باید از گزینهٔ معمولی filename استفاده شود و درگاه نامعتبر است. هنگامی که پروتکل VSOCK است، hostname همان CID ماشین مجازی راه دور خواهد بود.
(netsplice,net)listen برای اتصالهای شبکه TCP، به fio اعلام میکند که به جای برقراری یک اتصال خروجی، منتظر اتصالهای ورودی بماند (listen کند). در صورت استفاده از این گزینه، hostname باید حذف شود.
- (netsplice,net)pingpong
- در حالت عادی، یک نویسنده شبکه فقط به نوشتن داده ادامه میدهد و یک خواننده شبکه فقط بستهها را دریافت و مصرف میکند. اگر `pingpong=1' تنظیم شود، نویسنده بار داده (payload) معمول خود را به خواننده ارسال میکند، سپس منتظر میماند تا خواننده همان بار داده را برگرداند. این قابلیت به fio اجازه میدهد تا تاخیرهای شبکه را بسنجد. تاخیرهای ثبت (submission) و تکمیل (completion) در این حالت زمان محلی صرفشده برای ارسال یا دریافت را میسنجند، و تاخیر تکمیل مشخص میکند چه مدت طول کشیده است تا طرف مقابل داده را دریافت کرده و پس بفرستد. برای ترافیک چندپخشی (multicast) در UDP، هنگامی که چندین خواننده به یک نشانی یکسان گوش میدهند، `pingpong=1' باید تنها برای یک خواننده واحد تنظیم شود.
- (netsplice,net)window_size=int
- اندازه بافر سوکت مورد نظر را برای اتصال تنظیم میکند.
- (netsplice,net)mss=int
- بیشینه اندازه سگمنت TCP (TCP_MAXSEG) را تنظیم میکند.
- (e4defrag)donorname=str
- فایلی که به عنوان اهداکننده بلوک (donor) برای تعویض وسعتها (extents) بین فایلها استفاده میشود.
- (e4defrag)inplace=int
- راهبرد تخصیص بلوکهای فایل اهداکننده را پیکربندی میکند:
- 0
- پیشفرض. پیشتخصیص فایل اهداکننده در زمان راهاندازی اولیه.
- 1
- تخصیص فوری فضا درون رخداد یکپارچهسازی (defragment) و آزادسازی بلافاصله پس از پایان رخداد.
- (rbd,rados)clustername=str
- نام کلاستر Ceph را مشخص میکند.
- (rbd)rbdname=str
- نام RBD را مشخص میکند.
- (rbd,rados)pool=str
- نام استخر (pool) در Ceph که حاوی دادههای RBD یا RADOS است را مشخص میکند.
- (rbd,rados)clientname=str
- نام کاربری (بدون پیشوند 'client.') مورد استفاده برای دسترسی به کلاستر Ceph را مشخص میکند. اگر clustername مشخص شده باشد، clientname باید رشته کامل *type.id* باشد. اگر هیچ پیشوند type. داده نشود، fio به طور پیشفرض 'client.' را اضافه خواهد کرد.
- (rados)conf=str
- مسیر پیکربندی کلاستر ceph را مشخص میکند، بنابراین فایل conf لزوماً نباید /etc/ceph/ceph.conf باشد.
- (rbd,rados)busy_poll=bool
- به جای انتظار برای تکمیل، مخزن را پایش مداوم (poll) میکند. این گزینه معمولاً توان عملیاتی بهتری به قیمت مصرف بالاتر پردازنده (تا ۱۰۰٪) فراهم میکند.
- (rados)touch_objects=bool
- در طول راهاندازی اولیه، همه اشیاء (فایلها) را لمس (در صورت عدم وجود ایجاد) میکند. لمس همه اشیاء بر حافظههای موقت ceph تأثیر میگذارد و احتمالاً نتایج آزمون را دگرگون میسازد. به طور پیشفرض فعال است.
- (rbd)rbd_encryption_format=str
- قالب رمزنگاری ایمیج RBD را مشخص میکند. مقادیر پشتیبانیشده `luks1' و `luks2' هستند. در صورت تعیین، rbd_encryption_passphrase نیز باید مشخص شود. توجه داشته باشید که ایمیج باید از قبل با استفاده از `rbd encryption format <image>' قالببندی شده باشد؛ موتور rbd در fio تنها تلاش خواهد کرد بستر رمزنگاری را بارگذاری کند، نه اینکه ایمیج را فرمت کند. قابلیت رمزنگاری RBD به طور پیشفرض غیرفعال است. پشتیبانی از این ویژگی نیازمند نسخه ۱۶.۲ librbd (Ceph Pacific) یا جدیدتر است.
- (rbd)rbd_encryption_passphrase=str
- عبارتعبور مورد استفاده برای باز کردن قفل ایمیج رمزنگاریشده RBD. در صورت مشخص بودن rbd_encryption_format الزامی است.
- (http)http_host=str
- نام میزبانی که باید به آن متصل شد. در صورتی که مقدار پارامتر https برابر با off باشد، پورت ۸۰ در HTTP به طور خودکار استفاده میشود و در صورت فعال بودن (on) پورت ۴۴۳ در HTTPS به کار میرود. نام میزبان S3 به سبک virtual-hosted با نام یک باکت آغاز میشود، در حالی که نام میزبان S3 به سبک path-style اینگونه نیست. پیشفرض localhost است.
- (http)http_user=str
- نام کاربری برای احراز هویت HTTP.
- (http)http_pass=str
- گذرواژه برای احراز هویت HTTP.
- (http)https=str
- مشخص میکند که آیا به جای HTTP معمولی از HTTPS استفاده شود یا خیر. مقدار on پروتکل HTTPS را فعال میکند؛ مقدار insecure پروتکل HTTPS را فعال میسازد، اما اعتبارسنجی همتای SSL را غیرفعال میکند (با احتیاط استفاده شود!). پیشفرض off است.
- (http)http_mode=str
- حالت دسترسی HTTP مورد استفاده: webdav، swift یا s3. پیشفرض webdav است.
- (http)http_s3_region=str
- منطقه/ناحیه (region/zone) در S3 که باید در درخواست گنجانده شود. پیشفرض us-east-1 است.
- (http)http_s3_key=str
- کلید محرمانه (secret key) در S3.
- (http)http_s3_keyid=str
- شناسه دسترسی/کلید (access id) در S3.
- (http)http_s3_security_token=str
- توکن امنیتی S3.
- (http)http_s3_sse_customer_key=str
- کلید رمزنگاری مشتری در سمت سرور SSE.
- (http)http_s3_sse_customer_algorithm=str
- الگوریتم رمزنگاری مشتری در سمت سرور SSE. پیشفرض AES256 است.
- (http)http_s3_storage_class=str
- کلاس ذخیرهسازی برای دسترسی. تنظیماتی که توسط کاربر قابل سفارشیسازی است. پیشفرض STANDARD است.
- (http)http_swift_auth_token=str
- توکن احراز هویت Swift. برای نحوه دریافت آن به فایل پیکربندی نمونه مراجعه کنید.
- (http)http_verbose=int
- فعالسازی گزارشدهی پرجزئیات (verbose) درخواستها از libcurl. برای اشکالزدایی مفید است. مقدار 1 گزارشدهی پرجزئیات libcurl را فعال میکند و مقدار 2 علاوه بر آن ردگیری ورودی/خروجی HTTP را نیز به کار میاندازد. پیشفرض 0 است.
- (http)http_object_mode=str
- نحوه ساختاردهی اشیاء برای ورودی/خروجی HTTP: block یا range. پیشفرض block است.
- block
- برای هر بلوک یک شیء ایجاد میشود. موتور HTTP پارامتر blocksize را به عنوان اندازه شیء برای خواندن یا نوشتن در نظر میگیرد، و آفستهای شروع/پایان بلوک را به filename الحاق میکند تا مسیر شیء هدف را بسازد. عملیات خواندن و نوشتن هر بار روی کل اشیاء انجام میشود.
- range
- برای هر فایل یک شیء ایجاد میشود. مسیر شیء برای هر دو عملیات خواندن و نوشتن I/O مستقیماً همان نام فایل است. برای درخواستهای خواندن، از blocksize و offset برای تنظیم سرایند "Range" در درخواستها استفاده میشود تا خواندنهای جزئی از شیء انجام گیرد. برای درخواستهای نوشتن، همانند حالت block از blocksize برای تنظیم اندازه شیء استفاده میشود.
- (mtd)skip_bad=bool
- صرفنظر کردن از عملیات روی بلوکهای خرابِ شناختهشده (bad blocks).
- (libhdfs)hdfsdirectory
- کتابخانه libhdfs تکهها (chunks) را در این دایرکتوری HDFS ایجاد خواهد کرد.
- (libhdfs)chunk_size
- اندازه تکه مورد استفاده برای هر فایل.
- (rdma)verb=str
- دستور (verb) در RDMA برای استفاده در این سمت از اتصال موتور ورودی/خروجی RDMA. مقادیر معتبر عبارتند از write، read، send و recv. این موارد با دستورهای معادل RDMA متناظر هستند (مثلاً write = rdma_write و غیره). توجه داشته باشید که این مقدار تنها باید در سمت کلاینت اتصال مشخص شود. پوشه مثالها را بررسی کنید.
- (rdma)bindname=str
- نام مورد استفاده برای مقیدسازی (bind) اتصال محلی RDMA-CM به یک دستگاه محلی RDMA. این مقدار میتواند یک نام میزبان یا یک نشانی IPv4 یا IPv6 باشد. در سمت سرور این مقدار به تابع rdma_bind_addr() ارسال خواهد شد و در سمت کلاینت در تابع rdma_resolve_add() استفاده خواهد شد. این گزینه زمانی که چندین مسیر بین کلاینت و سرور وجود دارد یا در پیکربندیهای خاص بازگشتی (loopback) کاربرد دارد.
- (filestat)stat_type=str
- نوع فراخوانی سیستمی stat را برای اندازهگیری کارایی lookup/getattr مشخص میکند. پیشفرض برای stat(2) مقدار stat است.
- (sg)hipri
- اگر این گزینه تنظیم شود، fio تلاش خواهد کرد تا از اتمامهای پایششده ورودی/خروجی (polled IO completions) استفاده کند. این گزینه تأثیری مشابه با (io_uring)hipri خواهد داشت. تنها دستورهای READ و WRITE در SCSI دارای پرچم SGV4_FLAG_HIPRI خواهند بود (نه UNMAP (trim) و نه VERIFY). نسخههای قدیمیتر درایور sg لینوکس که از hipri پشتیبانی نمیکنند، به سادگی این پرچم را نادیده گرفته و ورودی/خروجی معمولی را انجام میدهند. درایور سطح پایین SCSI لینوکس (LLD) که «مالک» دستگاه است نیز باید از hipri (همچنین شناختهشده به عنوان iopoll و mq_poll) پشتیبانی کند. درایور MegaRAID نمونهای از یک SCSI LLD است. پیشفرض: غیرفعال (0) که ورودی/خروجی معمولی (مبتنی بر وقفه) را انجام میدهد.
- (sg,io_uring_cmd)readfua=bool
- با تنظیم گزینه readfua بر روی 1، عملیاتهای خواندن شامل پرچم دسترسی اجباری به واحد (fua) خواهند بود. پیشفرض: 0.
- (sg,io_uring_cmd)writefua=bool
- با تنظیم گزینه writefua بر روی 1، عملیاتهای نوشتن شامل پرچم دسترسی اجباری به واحد (fua) خواهند بود. پیشفرض: 0.
- (io_uring_cmd)write_mode=str
- نوع عملیات نوشتن را مشخص میکند. پیشفرض 'write' است.
- (io_uring_cmd)verify_mode=str
- نوع دستوری که قرار است در فاز اعتبارسنجی استفاده شود را مشخص میکند. پیشفرض “read” است.
- (sg)sg_write_mode=str
- نوع دستورهای نوشتن ارسالی را مشخص میکند. این گزینه میتواند مقادیر چندگانهای بپذیرد:
- write (default)
- کدهای دستوری (opcodeهای) Write طبق معمول صادر میشوند
- write_and_verify
- دستورهای WRITE AND VERIFY را صادر میکند. بیت BYTCHK روی 00b تنظیم میشود. این کار به دستگاه دستور میدهد تا بدون مقایسه دادهها، اعتبارسنجی رسانه را برای دادههای نوشتهشده انجام دهد. گزینه writefua با این انتخاب نادیده گرفته میشود.
- verify
- این گزینه منسوخ شده است. به جای آن از write_and_verify استفاده کنید.
- write_same
- دستورهای WRITE SAME را صادر میکند. این کار یک بلوک منفرد را به دستگاه منتقل کرده و همان بلوک داده را در دنبالهای پیوسته از LBAها که از آفست مشخصشده شروع میشود، مینویسد. پارامتر اندازه بلوک fio، حجم دادههای نوشتهشده با هر دستور را تعیین میکند. با این حال، مقدار دادهای که در واقع به دستگاه منتقل میشود برابر با اندازه بلوک (سکتور) دستگاه است. برای دستگاهی با سکتورهای ۵۱۲ بایتی، blocksize=8k با هر دستور ۱۶ سکتور را مینویسد. fio همچنان برای هر دستور ۸ کیلوبایت داده تولید میکند، اما تنها ۵۱۲ بایت اول استفاده شده و به دستگاه منتقل خواهد شد. گزینه writefua با این انتخاب نادیده گرفته میشود.
- same
- این گزینه منسوخ شده است. به جای آن از write_same استفاده کنید.
- write_same_ndob
- دستورهای WRITE SAME(16) را مشابه بالا اما با تنظیم بودن بیت No Data Output Buffer (NDOB) صادر میکند. با تنظیم بودن این بیت، هیچ دادهای به دستگاه منتقل نخواهد شد. دادههای نوشتهشده الگویی از پیش تعیینشده مانند تماماً صفر خواهند بود.
- write_stream
- دستورهای WRITE STREAM(16) را صادر میکند. از گزینه stream_id برای تعیین شناسه جریان استفاده کنید.
- verify_bytchk_00
- دستورهای VERIFY را با تنظیم BYTCHK روی 00 صادر میکند. این کار دستگاه را هدایت میکند تا اعتبارسنجی رسانه را بدون مقایسه داده انجام دهد.
- verify_bytchk_01
- دستورهای VERIFY را با تنظیم BYTCHK روی 01 صادر میکند. این کار دستگاه را هدایت میکند تا دادههای موجود روی دستگاه را با دادههای منتقلشده به دستگاه مقایسه کند.
- verify_bytchk_11
- دستورهای VERIFY را با تنظیم BYTCHK روی 11 صادر میکند. این کار یک بلوک منفرد را به دستگاه منتقل کرده و محتوای این بلوک را با دادههای روی دستگاه که از آفست مشخصشده شروع میشوند مقایسه میکند. پارامتر اندازه بلوک fio، مقدار کل دادههای مقایسهشده با این دستور را تعیین میکند. با این حال، تنها دادههای به اندازه یک بلوک (سکتور) به دستگاه منتقل میشود. این مشابه دستور WRITE SAME است، با این تفاوت که دادهها به جای نوشتهشدن، مقایسه میشوند.
- (sg)stream_id=int
- شناسه جریان را برای دستورهای WRITE STREAM تنظیم میکند. اگر این گزینه روی 0 (که یک شناسه معتبر نیست) تنظیم شود، fio یک جریان را باز کرده و پس از اتمام کار آن را میبندد. پیشفرض 0 است.
- (nbd)uri=str
- شناسه NBD URI سرور مورد آزمایش را مشخص میکند. این رشته یک NBD URI استاندارد است (ببینید: https://github.com/NetworkBlockDevice/nbd/tree/master/doc). نمونههای URI:
- (libcufile)gpu_dev_ids=str
- شناسههای GPU را برای استفاده با CUDA مشخص میکند. این یک فهرست از اعداد صحیح است که با دونقطه از هم جدا شدهاند. GPUها به صورت چرخشی (roundrobin) به workerها تخصیص داده میشوند. پیشفرض 0 است.
- (libcufile)cuda_io=str
- نوع I/O مورد استفاده با CUDA را مشخص میکند. این گزینه مقادیر زیر را میپذیرد:
- cufile (default)
- استفاده از libcufile و nvidia-fs. این گزینه I/O را مستقیماً بین یک سیستمفایل GPUDirect Storage و بافرهای GPU انجام میدهد و از استفاده از بافر جهشی (bounce buffer) جلوگیری میکند. اگر verify تنظیم شده باشد، از cudaMemcpy برای کپی کردن دادههای اعتبارسنجی بین RAM و GPU(ها) استفاده میشود. دادههای اعتبارسنجی پیش از نوشتن از RAM به GPU و پس از خواندن از GPU به RAM کپی میشوند. مقدار direct باید 1 باشد.
- posix
- استفاده از POSIX برای انجام I/O با بافر RAM، و استفاده از cudaMemcpy برای انتقال دادهها بین RAM و GPU(ها). دادهها پیش از نوشتن از GPU به RAM کپی شده و پس از خواندن از RAM به GPU کپی میشوند. مقدار verify تأثیری بر استفاده از cudaMemcpy ندارد.
- (dfs)pool
- برچسب یا UUID استخر DAOS را برای اتصال مشخص میکند.
- (dfs)cont
- برچسب یا UUID کانتینر DAOS را برای باز کردن مشخص میکند.
- (dfs)chunk_size
- اندازه تکه (chunk size) متفاوتی (به بایت) برای فایل dfs مشخص میکند. به طور پیشفرض از اندازه تکه کانتینر DAOS استفاده میشود.
- (dfs)object_class
- کلاس شیء متفاوتی برای فایل dfs مشخص میکند. به طور پیشفرض از کلاس شیء کانتینر DAOS استفاده میشود.
- (nfs)nfs_url
- یک URL در قالب libnfs، مانند nfs://<server|ipv4|ipv6>/path[?arg=val[&arg=val]*] برای جزئیات بیشتر به فایل README در libnfs مراجعه کنید.
- (exec)program=str
- برنامه مورد نظر برای اجرا را مشخص میکند. توجه داشته باشید که برنامه زمانی که کار به محدودیت زمانی برسد، یک سیگنال SIGTERM دریافت خواهد کرد. پس از پایان زمان کار، یک SIGKILL ارسال میشود. تأخیر بین این دو سیگنال توسط گزینه grace_time تعریف میشود.
- (exec)arguments=str
- آرگومانهایی را برای ارسال به برنامه مشخص میکند. برخی از متغیرهای ویژه را میتوان گسترش داد تا جزئیات کار fio به برنامه ارسال شود:
- %r
- با مدتزمان کار بر حسب ثانیه جایگزین میشود
- %n
- با نام کار جایگزین میشود
- (exec)grace_time=int
- زمان بین سیگنالهای SIGTERM و SIGKILL را مشخص میکند. پیشفرض ۱ ثانیه است.
- (exec)std_redirect=bool
- در صورت تنظیم، جریانهای stdout و stderr به فایلهایی که بر اساس نام کار نامگذاری شدهاند هدایت میشوند. پیشفرض true است.
- (xnvme)xnvme_async=str
- رابط دستورهای ناهمگام xnvme را انتخاب میکند. این گزینه میتواند مقادیر زیر را بپذیرد:
- emu
- این مقدار پیشفرض است و برای شبیهسازی I/O ناهمگام با استفاده از یک رشته (thread) واحد به کار میرود تا با استفاده از IOCTL درایور NVMe، یک جفتصف (queue pair) روی یک رابط I/O همگام ایجاد کند.
- thrpool
- یک رابط I/O ناهمگام را با استخری از رشتههای فضای کاربری روی یک رابط I/O همگام با استفاده از IOCTL درایور NVMe شبیهسازی میکند. به طور پیشفرض از چهار رشته استفاده میشود.
- io_uring
- رابط بومی I/O ناهمگام لینوکس که هم از I/O مستقیم (direct) و هم بافری (buffered) پشتیبانی میکند..TP libaio استفاده از aio لینوکس برای I/O ناهمگام (Asynchronous I/O).
- posix
- استفاده از رابط I/O ناهمگام posix برای اجرای یک یا چند عملیات I/O بهصورت ناهمگام.
- vfio
- استفاده از پیشانه (backend) مبتنی بر VFIO در فضای کاربر، پیادهسازیشده با libvfn بهجای SPDK.
- nil
- دادهای منتقل نشود؛ صرفاً تظاهر به انتقال انجام گیرد. این گزینه عمدتاً برای ارزیابی عملکرد و بررسیهای درونی استفاده میشود.
- (xnvme)xnvme_sync=str
- انتخاب رابط دستور همگام xnvme. این گزینه میتواند مقادیر زیر را بپذیرد.
- nvme
- این مقدار پیشفرض است و از ()ioctl درایور NVMe لینوکس برای I/O همگام استفاده میکند.
- psync
- از دستورهای معمولی و همچنین برداری ()pread و ()pwrite پشتیبانی میکند.
- block
- مشابه psync است، با این تفاوت که از دستورهای مدیریت ناحیه (zone management) با استفاده از IOCTLهای لایه بلوکی لینوکس نیز پشتیبانی میکند.
- (xnvme)xnvme_admin=str
- انتخاب رابط دستور مدیریتی (admin) برای xnvme. این گزینه میتواند مقادیر زیر را بپذیرد.
- (xnvme)xnvme_dev_nsid=int
- شناسه فضای نام (namespace) در xnvme برای درایورهای NVMe فضای کاربر مانند SPDK یا vfio.
- (xnvme)xnvme_dev_subnqn=str
- تنظیم NQN زیرسیستم برای fabrics. این گزینه برای استفادهٔ xNVMe از یک هدف fabrics با چندین سیستم کاربرد دارد.
- (xnvme)xnvme_mem=str
- انتخاب پیشانه (backend) حافظه xnvme. این گزینه میتواند مقادیر زیر را بپذیرد.
- posix
- این مقدار پیشفرضِ پیشانه حافظه posix برای درایور NVMe لینوکس است.
- hugepage
- استفاده از hugepageها بهجای پیشانه حافظه موجود posix. این پیشانه حافظه از hugetlbfs استفاده میکند. این امر نیازمند تخصیص hugepageها توسط کاربر، سوار کردن (mount) hugetlbfs و تنظیم متغیر محیطی XNVME_HUGETLB_PATH است.
- spdk
- از تخصیصدهنده حافظه SPDK استفاده میکند.
- vfio
- از تخصیصدهنده حافظه libvfn استفاده میکند. همچنین استفاده از پیشانه libvfn را بهجای SPDK مشخص میسازد.
- (xnvme)xnvme_iovec
- اگر این گزینه تنظیم شود، xnvme از دستورهای خواندن/نوشتن برداری (vectored) استفاده خواهد کرد.
- (libblkio)libblkio_driver=str
- درایور libblkio جهت استفاده. درایورهای مختلف از طریق رابطهای زیرساختی متفاوتی به دستگاهها دسترسی پیدا میکنند. درایورهای موجود به نسخه libblkio مورد استفاده بستگی دارند و در https://libblkio.gitlab.io/libblkio/blkio.html#drivers فهرست شدهاند.
- (libblkio)libblkio_path=str
- مقدار ویژگی مختص درایور "path" را پیش از اتصال نمونهٔ libblkio تنظیم میکند، که دستگاه یا فایل هدف را برای انجام I/O مشخص میسازد. مفهوم دقیق آن وابسته به درایور است و ممکن است همه درایورها از آن پشتیبانی نکنند؛ ببینید: https://libblkio.gitlab.io/libblkio/blkio.html#drivers
- (libblkio)libblkio_pre_connect_props=str
- فهرستی از ویژگیهای اضافی libblkio جداشده با دونقطه (:) که پس از ایجاد و پیش از اتصال نمونهٔ libblkio تنظیم میشوند. هر ویژگی باید دارای قالب <name>=<value> باشد. دونقطهها را میتوان بهصورت \: گریز داد. این موارد پس از تنظیم سایر ویژگیها توسط موتور اعمال میشوند، بنابراین میتوان مقادیر پیشین را با آنها بازنویسی کرد. ویژگیهای موجود به نسخه libblkio مورد استفاده بستگی دارند و در https://libblkio.gitlab.io/libblkio/blkio.html#properties فهرست شدهاند.
- (libblkio)libblkio_num_entries=int
- مقدار ویژگی مختص درایور "num-entries" را پیش از شروع نمونهٔ libblkio تنظیم میکند. مفهوم دقیق آن وابسته به درایور است و ممکن است همه درایورها از آن پشتیبانی نکنند؛ ببینید: https://libblkio.gitlab.io/libblkio/blkio.html#drivers
- (libblkio)libblkio_queue_size=int
- مقدار ویژگی مختص درایور "queue-size" را پیش از شروع نمونهٔ libblkio تنظیم میکند. مفهوم دقیق آن وابسته به درایور است و ممکن است همه درایورها از آن پشتیبانی نکنند؛ ببینید: https://libblkio.gitlab.io/libblkio/blkio.html#drivers
- (libblkio)libblkio_pre_start_props=str
- فهرستی از ویژگیهای اضافی libblkio جداشده با دونقطه (:) که پس از اتصال و پیش از شروع نمونهٔ libblkio تنظیم میشوند. هر ویژگی باید دارای قالب <name>=<value> باشد. دونقطهها را میتوان بهصورت \: گریز داد. این موارد پس از تنظیم سایر ویژگیها توسط موتور اعمال میشوند، بنابراین میتوان مقادیر پیشین را با آنها بازنویسی کرد. ویژگیهای موجود به نسخه libblkio مورد استفاده بستگی دارند و در https://libblkio.gitlab.io/libblkio/blkio.html#properties فهرست شدهاند.
- (libblkio)hipri
- استفاده از صفهای مبتنی بر نظرسنجی (poll queues). این گزینه با libblkio_wait_mode=eventfd و libblkio_force_enable_completion_eventfd ناسازگار است.
- (libblkio)libblkio_vectored
- ارسال درخواستهای خواندن و نوشتن برداری (vectored).
- (libblkio)libblkio_write_zeroes_on_trim
- ارسال درخواستهای trim بهصورت درخواستهای "write zeroes" بهجای درخواستهای discard.
- (libblkio)libblkio_wait_mode=str
- نحوه انتظار برای تکمیل عملیات:
- (libblkio)libblkio_force_enable_completion_eventfd
- فعالسازی eventfd تکمیل صف حتی در صورتی که استفاده نشود. این امر ممکن است بر عملکرد تأثیر بگذارد. پیشفرض فعالسازی آن تنها در صورت libblkio_wait_mode=eventfd است.
- (windowsaio)no_completion_thread
- اجتناب از استفاده از یک رشتهٔ (thread) مجزا برای نظرسنجی تکمیل عملیات (completion polling)..SS "عمق ورودی/خروجی (I/O depth)"
- iodepth=int
- تعداد واحدهای I/O که بهطور همزمان در جریان پردازش (in flight) بر روی فایل نگهداشته میشوند. توجه داشته باشید که افزایش iodepth به بیش از ۱، تأثیری بر ioengineهای همگام نخواهد داشت (مگر در موارد جزئی هنگامی که verify_async در حال استفاده باشد). حتی موتورهای ناهمگام (async) نیز ممکن است به دلیل محدودیتهای سیستمعامل نتوانند به عمق مورد نظر دست یابند. این موضوع ممکن است در لینوکس هنگام استفاده از libaio و عدم تنظیم `direct=1' رخ دهد، زیرا در این سیستمعامل ورودی/خروجی بافری ناهمگام نیست. توزیع عمق I/O را در خروجی fio بررسی کنید تا مطمئن شوید عمق حاصلشده همان مقدار مورد انتظار است. پیشفرض: 1.
- iodepth_batch_submit=int, iodepth_batch=int
- مشخص میکند که چه تعداد I/O به یکباره ارسال شوند. مقدار پیشفرض ۱ است، به این معنی که هر I/O به محض آماده شدن ارسال میشود، اما میتوان آن را افزایش داد تا دستههای بزرگتری از I/O در هر نوبت ارسال شوند. اگر روی 0 تنظیم شود، مقدار iodepth استفاده خواهد شد.
- iodepth_batch_complete_min=int, iodepth_batch_complete=int
- مشخص میکند که چه تعداد I/O در هر نوبت دریافت شوند. مقدار پیشفرض ۱ است، به این معنی که در فرایند دریافت از هسته، حداقل ۱ درخواست I/O مطالبه خواهد شد. دریافت I/O تا زمانی ادامه مییابد که به حد تعیینشده توسط iodepth_low برسد. اگر این متغیر روی 0 تنظیم شود، fio پیش از صفبندی I/Oهای بیشتر، همواره رویدادهای تکمیلشده را بررسی میکند. این کار به کاهش تاخیر I/O کمک میکند، اما به بهای فراخوانیهای سیستمی بیشتر برای دریافت.
- iodepth_batch_complete_max=int
- حداکثر تعداد I/Oهای قابل دریافت در هر نوبت را مشخص میکند. این متغیر باید به همراه متغیر iodepth_batch_complete_min=int استفاده شود که محدوده حداقل و حداکثر مقدار I/O قابل دریافت را مشخص میسازد. بهطور پیشفرض، برابر با مقدار iodepth_batch_complete_min است. مثال ۱:
iodepth_batch_complete_min=1
iodepth_batch_complete_max=<iodepth>
بدین معنی که ما حداقل ۱ ورودی/خروجی و حداکثر تا کل عمق صفِ ارسالشده را دریافت خواهیم کرد. اگر هیچ I/O هنوز کامل نشده باشد، منتظر خواهیم ماند. مثال ۲:
iodepth_batch_complete_min=0
iodepth_batch_complete_max=<iodepth>
بدین معنی که ما میتوانیم تا سقف کل عمق صفِ ارسالشده را دریافت کنیم، اما اگر هنوز هیچ I/O کامل نشده باشد، منتظر نخواهیم ماند و فوراً از فراخوانی سیستمی خارج میشویم. در این مثال، ما صرفاً عمل سرکشی (polling) را انجام میدهیم.
- iodepth_low=int
- حد آستانه پایین (low water mark) که مشخص میکند چه زمانی باید دوباره پر کردن صف آغاز شود. مقدار پیشفرض آن همانند iodepth است، به این معنی که fio همواره سعی خواهد کرد صف را پر نگه دارد. اگر برای مثال iodepth روی 16 و iodepth_low روی 4 تنظیم شود، پس از اینکه fio صف را با ۱۶ درخواست پر کرد، اجازه میدهد تا عمق آن تخلیه شده و به ۴ برسد، سپس دوباره شروع به پر کردن آن میکند.
- serialize_overlap=bool
- سریسازی I/Oهای در حال انجام که در غیر این صورت ممکن است باعث ایجاد وضعیت رقابتی دادهها (data races) شوند یا از آن آسیب ببینند. هنگامی که دو یا چند I/O به صورت همزمان ارسال میشوند، هیچ تضمینی وجود ندارد که این I/Oها به همان ترتیب ارسال، پردازش یا تکمیل شوند. علاوه بر این، اگر دو یا چند مورد از این I/Oها از نوع نوشتن باشند، هر ناحیه همپوشان میان آنها میتواند روی ذخیرهسازهای مشخصی نامعین یا تعریفنشده شود. این مسائل میتوانند در صورتی که حداقل یکی از I/Oهای در حال رقابت دادهها را تغییر دهد و ناحیه همپوشان اندازهای غیرصفر داشته باشد، باعث شکستهای نامنظم در اعتبارسنجی شوند. تنظیم serialize_overlap به fio میگوید تا با سریسازی صریح I/Oهای در حال انجامی که همپوشانی غیرصفر دارند، از بروز این رفتار جلوگیری کند. توجه داشته باشید که فعال کردن این گزینه میتواند هم کارایی و هم iodepth بهدستآمده را کاهش دهد.
این گزینه فقط برای I/Oهای صادرشده برای یک کار تکی اعمال میشود، مگر اینکه به همراه io_submit_mode=offload فعال شده باشد. در حالت offload، ابزار fio همپوشانی را در بین تمام I/Oهای ارسالشده توسط کارهای offload که serialize_overlap در آنها فعال است بررسی میکند.
پیشفرض: false.
- io_submit_mode=str
- این گزینه نحوه ارسال I/O توسط fio به موتور ورودی/خروجی را کنترل میکند. مقدار پیشفرض `inline' است، بدین معنی که ریسههای کار fio مستقیماً I/O را ارسال کرده و دریافت میکنند. اگر روی `offload' تنظیم شود، ریسههای کار فرایند ارسال I/O را به یک استخر اختصاصی از ریسههای I/O واگذار میکنند. این کار نیازمند مقداری هماهنگی است و در نتیجه بار اضافی اندکی به همراه دارد، بهویژه برای I/Oهایی با عمق صف پایینتر که میتواند باعث افزایش تاخیرها شود. مزیت این روش آن است که fio میتواند نرخ ارسال را مستقل از نرخ تکمیل دستگاه مدیریت کند. این امر مانع از گزارش نادقیق تاخیر در صورت انباشته شدن I/O در سمت دستگاه میشود (مشکل omission هماهنگشده). توجه داشته باشید که این گزینه را نمیتوان به طور قابل اطمینان با موتورهای I/O ناهمگام به کار برد.
نرخ ورودی/خروجی (I/O rate)
- thinkcycles=int
- کار را پس از تکمیل یک I/O و پیش از صدور درخواست بعدی، به تعداد چرخههای مشخصشده متوقف میکند. میتواند برای شبیهسازی پردازشهای انجامشده توسط یک برنامه کاربردی به کار رود. این مقدار در زمان محاسبهشده برای توقف thinktime لحاظ نمیشود. ممکن است بر روی برخی پلتفرمها تأثیری نداشته باشد؛ این موضوع را میتوان با تنظیم مقداری به اندازه کافی بزرگ برای thinkcycles بررسی کرد.
- thinktime=time
- کار را پس از تکمیل یک I/O و پیش از صدور درخواست بعدی، برای مدت زمان مشخصشده متوقف میکند. میتواند برای شبیهسازی پردازش انجامشده توسط یک برنامه کاربردی استفاده شود. در صورت عدم ذکر واحد، مقدار بر حسب میکروثانیه تفسیر میشود. گزینههای thinktime_blocks، thinktime_iotime و thinktime_spin را ببینید.
- thinktime_spin=time
- تنها در صورتی معتبر است که thinktime تنظیم شده باشد - وانمود کردن به صرف زمان پردازنده (CPU) برای انجام عملیاتی بر روی دادههای دریافتشده، پیش از رفتن به حالت خواب برای باقیمانده مدت مشخصشده با thinktime. هنگامی که واحد ذکر نشود، مقدار به عنوان میکروثانیه تفسیر میشود.
- thinktime_blocks=int
- تنها در صورتی معتبر است که thinktime تنظیم شده باشد - کنترل میکند که چه تعداد بلوک صادر شوند، پیش از آنکه به اندازه thinktime میکروثانیه توقف انجام شود. در صورت عدم تنظیم، مقدار پیشفرض ۱ است که باعث میشود fio پس از هر بلوک، به اندازه thinktime میکروثانیه منتظر بماند. این کار عملاً هرگونه تنظیم عمق صف را بیاثر میکند، زیرا تا پیش از تکمیل درخواست و سپری شدن thinktime، بیش از ۱ درخواست I/O در صف قرار نخواهد گرفت. به عبارت دیگر، این تنظیم اگر عمق صف بزرگتر باشد، عملاً سقفی بر آن اعمال میکند.
- thinktime_blocks_type=str
- تنها در صورتی معتبر است که thinktime تنظیم شده باشد - نحوه فعالسازی thinktime_blocks را کنترل میکند. مقدار پیشفرض `complete' است که وقتی fio به تعداد بلوکهای thinktime_blocks را تکمیل کند، thinktime را فعال میسازد. اگر روی `issue' تنظیم شود، این فعالسازی در سمت صدور رخ میدهد.
- thinktime_iotime=time
- تنها در صورتی معتبر است که thinktime تنظیم شده باشد - بازه زمانی thinktime را بر اساس زمان کنترل میکند. توقف thinktime پس از اجرای IOها به مدت زمان thinktime_iotime تکرار میشود. برای مثال، `--thinktime_iotime=9s --thinktime=1s' یک چرخه ۱۰ ثانیهای را تکرار میکند که شامل ۹ ثانیه IO و ۱ ثانیه توقف است. اگر واحد ذکر نشود، thinktime_iotime بر حسب ثانیه تفسیر میشود. اگر این گزینه همراه با thinktime_blocks استفاده شود، توقف thinktime پس از گذشت زمان thinktime_iotime یا پردازش تعداد بلوکهای thinktime_blocks تکرار خواهد شد، هر کدام که زودتر رخ دهد.
- rate=int[,int][,int]
- پهنای باند مصرفی توسط این کار را محدود میکند. مقدار بر حسب بایت بر ثانیه (bytes/sec) است و قوانین معمول پسوندها اعمال میشوند. مقادیر جداشده با کاما میتوانند برای خواندن، نوشتن و trimها همانطور که در blocksize توضیح داده شده مشخص شوند.
برای مثال، استفاده از `rate=1m,500k' خواندن را به 1MiB/sec و نوشتن را به 500KiB/sec محدود میکند. محدود کردن صرف خواندن یا نوشتن میتواند با `rate=,500k' یا `rate=500k,' انجام شود، که در اولی فقط نوشتن (به 500KiB/sec) و در دومی فقط خواندن محدود میشود.
- rate_min=int[,int][,int]
- به fio اعلام میکند که تمام تلاش خود را برای حفظ حداقل این پهنای باند به کار گیرد. ناتوانی در برآورده کردن این نیازمندی باعث خروج کار خواهد شد. مقادیر جداشده با کاما میتوانند برای خواندن، نوشتن و trimها مطابق با توضیحات blocksize مشخص شوند.
- rate_iops=int[,int][,int]
- پهنای باند را به این تعداد از IOPS محدود میکند. اساساً مشابه rate است، با این تفاوت که مستقل از پهنای باند مشخص میشود. اگر به جای یک مقدار ثابت، محدودهای از اندازه بلوک به کار داده شده باشد، کوچکترین اندازه بلوک به عنوان معیار سنجش استفاده میشود. مقادیر جداشده با کاما میتوانند برای خواندن، نوشتن و trimها همانطور که در blocksize توضیح داده شده مشخص شوند.
- rate_iops_min=int[,int][,int]
- اگر fio نتواند به این نرخ I/O برسد، باعث خروج کار میشود. مقادیر جداشده با کاما میتوانند برای خواندن، نوشتن و trimها همانطور که در blocksize شرح داده شده مشخص شوند.
- rate_process=str
- این گزینه نحوه مدیریت ارسالهای دارای نرخ مشخص I/O را توسط fio کنترل میکند. پیشفرض `linear' است که I/O را به صورت خطی با تاخیرهای ثابت بین I/Oها ارسال میکند و این تاخیرها بر اساس نرخهای تکمیل I/O تنظیم میشوند. اگر این گزینه روی `poisson' تنظیم شود، fio ورودی/خروجی را بر اساس جریان تصادفی درخواستهای واقعیتر، موسوم به فرایند پواسون (https://en.wikipedia.org/wiki/Poisson_point_process) ارسال میکند. مقدار لاندا برای بار کاری دادهشده برابر با 10^6 / IOPS خواهد بود.
- rate_ignore_thinktime=bool
- بهطور پیشفرض، اگر هر نوع تنظیمی از thinktime استفاده شده باشد، fio تلاش میکند تا به تنظیم نرخ مشخصشده برسد (آن را جبران کند). اگر این گزینه فعال شود، fio زمان thinktime را نادیده گرفته و به جای ورود به حالت جبران پس از اتمام thinktime، به انجام IO با همان نرخ مشخصشده ادامه میدهد.
- rate_cycle=int
- میانگین پهنای باند را برای rate_min و rate_iops_min در این تعداد میلیثانیه محاسبه میکند. پیشفرض: 1000..SS "تأخیر ورودی/خروجی (I/O latency)"
- latency_target=time
- در صورت تنظیم، fio تلاش خواهد کرد بیشترین نقطه کارایی را بیابد که حجم کاری مشخصشده میتواند در آن اجرا شود در حالی که تأخیر را زیر این هدف حفظ میکند. در صورت عدم ذکر واحد، مقدار بر حسب میکروثانیه تفسیر میشود. latency_window و latency_percentile را ببینید.
- latency_window=time
- به همراه latency_target برای تعیین پنجره نمونهبرداری استفاده میشود که کار در آن در عمقهای صف متغیر برای آزمودن کارایی اجرا میشود. در صورت عدم ذکر واحد، مقدار بر حسب میکروثانیه تفسیر میشود.
- latency_percentile=float
- درصد I/Oهایی که باید در محدوده معیارهای مشخصشده توسط latency_target و latency_window قرار گیرند. در صورت عدم تنظیم، مقدار پیشفرض آن 100.0 است؛ به این معنی که تمام I/Oها باید برابر یا کمتر از مقدار تعیینشده توسط latency_target باشند.
- latency_run=bool
- به همراه latency_target استفاده میشود. اگر false (پیشفرض) باشد، fio بالاترین عمق صفی را که latency_target را برآورده میکند پیدا کرده و خارج میشود. اگر true باشد، fio به اجرا ادامه داده و تلاش میکند با تنظیم عمق صف، latency_target را برآورده سازد.
- max_latency=time[,time][,time]
- در صورت تنظیم، اگر کار از این حداکثر تأخیر فراتر رود، fio با خطای ETIMEDOUT از آن خارج میشود. در صورت عدم ذکر واحد، مقدار بر حسب میکروثانیه تفسیر میشود. مقادیر جداشده با کاما میتوانند برای خواندنها، نوشتنها و trimها مطابق با توضیحات blocksize مشخص شوند.
بازپخش ورودی/خروجی (I/O replay)
- write_iolog=str
- الگوهای I/O صادرشده را در فایل مشخصشده مینویسد. read_iolog را ببینید. برای هر کار یک فایل جداگانه مشخص کنید، در غیر این صورت iologها با هم تداخل پیدا کرده و ممکن است فایل خراب شود. این فایل در حالت الحاق (append mode) باز خواهد شد.
- read_iolog=str
- یک iolog با نام فایل مشخصشده را باز کرده و الگوهای I/O موجود در آن را بازپخش میکند. این گزینه میتواند برای ذخیره یک حجم کاری و بازپخش آن در زمانی دیگر استفاده شود. iolog ارائهشده همچنین میتواند یک فایل باینری blktrace باشد که به fio اجازه میدهد حجم کاری ثبتشده توسط blktrace را بازپخش کند. برای چگونگی ثبت اینگونه دادههای لاگ، blktrace(8) را ببینید. برای بازپخش blktrace، ابتدا باید فایل به یک فایل داده باینری blkparse تبدیل شود (“blkparse <device> -o /dev/null -d file_for_fio.bin”). میتوانید با جدا کردن نامها توسط نویسه ':' چندین فایل را مشخص کنید. برای اطلاعات در مورد چگونگی گریز (escape) دادن نویسههای ':' درون نام فایلها، گزینه filename را ببینید. این فایلها به ترتیب به کلونهای کاری ایجاد شده توسط numjobs اختصاص مییابند. '-' یک نام رزرو شده به معنای خواندن از stdin است؛ به ویژه اگر filename نیز روی '-' (که آن هم به معنای stdin است) تنظیم شده باشد، این پرچم نمیتواند روی '-' تنظیم شود.
- read_iolog_chunked=bool
- نحوه خواندن iolog را تعیین میکند. اگر false (پیشفرض) باشد، تمام read_iolog به یکباره خوانده میشود. در صورت انتخاب true، ورودی از iolog به صورت تدریجی خوانده خواهد شد. زمانی مفید است که iolog بسیار بزرگ باشد یا به صورت پویا تولید شود.
- merge_blktrace_file=str
- در صورت تعیین، به جای بازپخش لاگهای ارسالشده به read_iolog، لاگها از یک مرحله ادغام عبور میکنند که آنها را در یک فایل blktrace واحد تجمیع میکند. سپس فایل حاصل به عنوان پارامتر read_iolog ارسال میشود. هدف از این کار، یکپارچه و سازگار کردن ترتیب رویدادها است. این امر در مقایسه با بازپخش چندین blktrace از طریق کارهای همزمان، تأثیر زمانبند (scheduler) را محدود میکند.
- merge_blktrace_scalars=float_list
- این یک گزینه بر پایه درصد است که بر اساس نمایه با فهرست فایلهای ارائهشده به read_iolog جفت میشود. هنگام انجام ادغام، زمان هر رویداد با مقدار مربوطه مقیاسبندی میشود. به عنوان مثال، “--merge_blktrace_scalars="50:100"” رد اول را در نیمزمان (halftime) و رد دوم را در زمان واقعی (realtime) اجرا میکند. این تنظیم جدا از replay_time_scale قابل تنظیم است؛ گزینهای که رد را در حین زمان اجرا مقیاسبندی کرده و برخلاف این گزینه، خروجی ادغام را تغییر نمیدهد.
- merge_blktrace_iters=float_list
- این یک گزینه با عدد صحیح است که بر اساس نمایه با فهرست فایلهای ارائهشده به read_iolog جفت میشود. هنگام انجام ادغام، هر رد به تعداد دفعات تکرار مشخصشده اجرا میشود. به عنوان مثال، “--merge_blktrace_iters="2:1"” رد اول را برای دو تکرار و رد دوم را برای یک تکرار اجرا میکند.
- replay_no_stall=bool
- هنگام بازپخش I/O با read_iolog، رفتار پیشفرض تلاش برای رعایت برچسبهای زمانی درون لاگ و بازپخش آنها با تأخیر مناسب بین IOPS است. با تنظیم این متغیر، fio برچسبهای زمانی را نادیده گرفته و تلاش میکند در عین حفظ ترتیب رویدادها، آنها را با حداکثر سرعت ممکن بازپخش کند. نتیجه، همان الگوی I/O روی یک دستگاه معین اما با زمانبندیهای متفاوت خواهد بود.
- replay_time_scale=int
- هنگام بازپخش I/O با read_iolog، ابزار fio زمانبندی اصلی در رد را رعایت خواهد کرد. با این گزینه، امکان مقیاسبندی زمان وجود دارد. این گزینه درصدی است؛ اگر روی 50 تنظیم شود، به معنای اجرا با 50% نرخ I/O اصلی در رد است. اگر روی 200 تنظیم شود، با دو برابر نرخ I/O اصلی اجرا میشود. مقدار پیشفرض 100 است.
- replay_redirect=str
- هنگام بازپخش الگوهای I/O با استفاده از read_iolog، رفتار پیشفرض بازپخش IOPS روی دستگاه major/minor است که هر IOP از آن ضبط شده بود. این رفتار گاهی نامطلوب است زیرا در یک ماشین دیگر این شمارههای major/minor ممکن است به دستگاه متفاوتی نگاشت شوند. تغییر سختافزار در همان سیستم نیز میتواند به نگاشت major/minor متفاوتی منجر شود. گزینه replay_redirect باعث میشود تمام I/Oها بدون در نظر گرفتن دستگاهی که از آن ضبط شدهاند، روی یک دستگاه مشخصشده واحد بازپخش شوند؛ مثلاً “replay_redirect=/dev/sdc” باعث میشود تمام I/Oها در blktrace یا iolog روی “/dev/sdc” بازپخش شوند. این بدان معناست که اگر رد شامل چندین دستگاه باشد، چندین دستگاه روی یک دستگاه واحد بازپخش خواهند شد. اگر میخواهید چندین دستگاه به طور همزمان روی چندین دستگاه هدایتشده بازپخش شوند، باید رد خود را با blkparse به ردهای جداگانه تقسیم کرده و آنها را با فراخوانیهای مستقل fio بازپخش کنید. متأسفانه این کار همچنین ترتیب زمانی دقیق بین دسترسی به چندین دستگاه را از بین میبرد.
- replay_align=int
- تراز آفستهای بایتی در یک رد را به این مقدار تحمیل میکند. مقدار باید توانی از 2 باشد.
- replay_scale=int
- هنگام بازپخش ردها، آفستهای بایتی را با این ضریب کاهش میدهد. به احتمال زیاد باید از replay_align نیز استفاده شود.
نخها، فرایندها و همگامسازی کار (Threads, processes and job synchronization)
- replay_skip=str
- گاهی اوقات رد کردن برخی از انواع I/O در یک رد بازپخش مفید است. این کار میتواند برای نمونه حذف نوشتنها در رد باشد، یا بازپخش نکردن trim/discardها در صورتی که به دستگاهی بازهدایت میکنید که از آنها پشتیبانی نمیکند. این گزینه فهرستی جداشده با کاما از مقادیر read، write، trim و sync میپذیرد.
- thread
- ابزار fio به طور پیشفرض کارها را با استفاده از fork ایجاد میکند، با این حال اگر این گزینه داده شود، fio در عوض کارها را با استفاده از تابع رشتههای پازیکس (POSIX Threads) یعنی pthread_create(3) به عنوان نخ ایجاد خواهد کرد.
- wait_for=str
- در صورت تنظیم، کار جاری تا زمانی که تمام کارگران (workers) کار مشخصشده در waitee به پایان نرسند، آغاز نخواهد شد. گزینه wait_for بر اساس نام کار عمل میکند، بنابراین چند محدودیت وجود دارد: نخست، کار مورد انتظار (waitee) باید پیش از کار منتظر (waiter) تعریف شده باشد (به این معنی که ارجاع رو به جلو مجاز نیست). دوم، اگر کاری به عنوان waitee ارجاع داده میشود، باید یک نام یکتا داشته باشد (فاقد waiteeهای تکراری).
- comm=str
- مقدار comm فرایند کار را روی رشته مشخصشده تنظیم میکند. راهنمای prctrl(2) را ببینید. توجه: این گزینه در حال حاضر تنها در لینوکس پشتیبانی میشود.
- nice=int
- کار را با مقدار nice دادهشده اجرا میکند. راهنمای nice(2) را ببینید. در ویندوز، مقادیر کمتر از -15 رده اولویت فرایند را روی “High”، مقادیر -1 تا -15 روی “Above Normal”، مقادیر 1 تا 15 روی “Below Normal” و بالاتر از 15 روی رده اولویت “Idle” تنظیم میکنند.
- prio=int
- مقدار اولویت I/O این کار را تعیین میکند. لینوکس کاربر را به یک مقدار مثبت بین 0 و 7 محدود میکند که 0 بالاترین اولویت است. راهنمای ionice(1) را ببینید. برای سایر سیستمهای عامل به صفحه راهنمای مربوطه مراجعه کنید چرا که مفهوم اولویت ممکن است متفاوت باشد. برای تنظیم اولویت به ازای هر دستور، گزینههای مختص موتور I/O یعنی `cmdprio_percentage` و `cmdprio` را ببینید.
- prioclass=int
- رده اولویت I/O را تعیین میکند. راهنمای ionice(1) را ببینید. برای تنظیم اولویت به ازای هر دستور، گزینههای مختص موتور I/O یعنی `cmdprio_percentage` و `cmdprio_class` را ببینید.
- priohint=int
- راهنمای اولویت I/O را تعیین میکند. این گزینه تنها در پلتفرمهایی که از ردههای اولویت I/O پشتیبانی میکنند و برای دستگاههایی با ویژگیهای کنترلشده از طریق hintهای اولویت کاربرد دارد؛ مانند دستگاههای بلوکی که از محدودیتهای مدت دستور یا CDL پشتیبانی میکنند. CDL روشی برای نشان دادن حداکثر تأخیر مطلوب I/Oها است تا دستگاه بتواند زمانبندی دستورات داخلی خود را با توجه به محدودیتهای تأخیر مشخصشده توسط کاربر بهینهسازی کند. برای تنظیم راهنمای اولویت به ازای هر I/O، گزینه مختص موتور I/O یعنی cmdprio_hint را ببینید.
- cpus_allowed=str
- همان گزینههای cpumask را کنترل میکند، اما در عوض مشخصات متنی پردازندههای مجاز را میپذیرد و پردازندهها از 0 شمارهگذاری میشوند. بنابراین برای استفاده از پردازندههای 0 و 5، مقدار `cpus_allowed=0,5` را مشخص میکنید. این گزینه همچنین اجازه میدهد محدودهای از پردازندهها مشخص شود -- مثلاً اگر میخواستید وابستگی (binding) به پردازندههای 0، 5 و 8 تا 15 ایجاد کنید، `cpus_allowed=0,5,8-15` را تنظیم میکردید.
در ویندوز، هنگامی که `cpus_allowed` تنظیم نشده باشد، تنها پردازندههای گروه پردازنده فعلی fio استفاده خواهند شد و تنظیمات وابستگی (affinity) از سیستم به ارث میرسد. ساخت fio که برای ویندوز 7 پیکربندی شده باشد، گزینههای تنظیمکننده پردازندهها را نسبت به گروه پردازنده آگاه میکند و مقادیر، هم گروه پردازنده و هم پردازندهای از درون آن گروه را تنظیم میکنند. به عنوان مثال، در سیستمی که گروه پردازنده 0 دارای 40 پردازنده و گروه پردازنده 1 دارای 32 پردازنده است، مقادیر `cpus_allowed` بین 0 و 39 پردازندههای گروه پردازنده 0 را پیوند داده و مقادیر `cpus_allowed` بین 40 و 71 پردازندههای گروه پردازنده 1 را پیوند میدهند. هنگام استفاده از `cpus_allowed_policy=shared` تمام پردازندههای مشخصشده با یک گزینه واحد `cpus_allowed` باید از همان گروه پردازنده باشند. برای ساختهای ویندوز fio که برای ویندوز 7 ساخته نشدهاند، پردازندهها فقط از هر گروه پردازندهای که fio تصادفاً در آن اجرا میشود انتخاب خواهند شد (و نسبت به آن سنجیده میشوند) و پردازندههای سایر گروههای پردازنده قابل استفاده نیستند.
- cpus_allowed_policy=str
- سیاست نحوه توزیع پردازندههای مشخصشده توسط cpus_allowed یا cpumask توسط fio را تعیین میکند. دو سیاست پشتیبانی میشوند:
- split
- هر job یک CPU اختصاصی از مجموعهٔ CPU دریافت خواهد کرد.
در صورتی
که
گزینهای
تعیین
نشود، shared
رفتار
پیشفرض
است. اگر split
مشخص شده
باشد،
آنگاه fio به
هر job یک CPU
تخصیص
میدهد. اگر
تعداد CPUهای
ارائهشده
برای jobهای
فهرستشده
کافی
نباشد، fio
پردازندههای
موجود در
مجموعه را
بهصورت
نوبتگردشی
(roundrobin) تخصیص
میدهد.
- cpumask=int
- وابستگی پردازندهای (CPU affinity) این job را تنظیم میکند. پارامتر ارائهشده یک ماسک بیتی از پردازندههای مجاز است که job میتواند روی آنها اجرا شود. بنابراین اگر میخواهید پردازندههای مجاز ۱ و ۵ باشند، باید مقدار دهدهی (1 << 1 | 1 << 5) یا 34 را ارسال کنید. به صفحهٔ راهنمای sched_setaffinity(2) مراجعه کنید. این گزینه ممکن است روی همهٔ سیستمعاملها یا نسخههای کرنل پشتیبانیشده کار نکند. این گزینه برای تعداد پردازندههای بیشتر از آنچه بتوان در یک ماسک عدد صحیح ذخیره کرد بهخوبی کار نمیکند، بنابراین تنها میتواند پردازندههای 1-32 را کنترل کند. برای سیستمهایی با تعداد CPU بیشتر، از cpus_allowed استفاده کنید.
- numa_cpu_nodes=str
- اجرای این job را روی پردازندههای گرههای NUMA مشخصشده تنظیم میکند. آرگومانها شامل فهرستی از شمارههای پردازنده جداشده با کاما، بازههای A-B، یا `all' هستند. توجه داشته باشید که برای فعالسازی پشتیبانی از گزینههای NUMA، برنامهٔ fio باید روی سیستمی ساخته (کامپایل) شود که libnuma-dev(el) روی آن نصب باشد.
- numa_mem_policy=str
- سیاست حافظهٔ این job و گرههای NUMA متناظر آن را مشخص میکند. قالب آرگومانها:
<mode>[:<nodelist>]
مقدار `mode' یکی از سیاستهای حافظهٔ زیر است: `default'، `prefer'، `bind'، `interleave' یا `local'. برای سیاستهای حافظهٔ `default' و `local'، نیازی به تعیین هیچ گرهای نیست. برای `prefer'، تنها یک گره مجاز است. برای `bind' و `interleave'، مقدار `nodelist' میتواند بهصورت زیر باشد: فهرستی از اعداد جداشده با کاما، بازههای A-B، یا `all'.
- cgroup=str
- این job را به این گروه کنترلی (cgroup) اضافه میکند. اگر وجود نداشته باشد، ایجاد خواهد شد. برای کارکرد این گزینه، سیستم باید یک نقطهٔ اتصال سوارشدهٔ cgroup blkio داشته باشد. اگر سیستم شما آن را سوار نکرده است، میتوانید با دستور زیر این کار را انجام دهید:
# mount -t cgroup -o blkio none /cgroup
- cgroup_weight=int
- وزن cgroup را روی این مقدار تنظیم میکند. مستندات ارائهشده همراه با کرنل را ببینید؛ مقادیر مجاز در بازهٔ 100..1000 هستند.
- cgroup_nodelete=bool
- بهطور معمول fio پس از تکمیل job، گروههای کنترلی (cgroups) ایجادشده را حذف میکند. برای نادیدهگرفتن این رفتار و باقی گذاشتن cgroupها پس از تکمیل job، مقدار `cgroup_nodelete=1' را تنظیم کنید. این گزینه میتواند زمانی مفید باشد که بخواهید فایلهای مختلف cgroup را پس از اتمام job بررسی کنید. پیشفرض: false.
- flow_id=int
- شناسهٔ جریان (flow). اگر مشخص نشود، مقدار پیشفرض آن یک جریان سراسری (global) خواهد بود. به flow مراجعه کنید.
- flow=int
- وزن در کنترل جریان مبتنی بر توکن (token-based flow control). اگر از این مقدار استفاده شود، آنگاه fio فعالیت بین دو یا چند job را که flow_id یکسانی را به اشتراک میگذارند تنظیم میکند. برنامهٔ fio تلاش میکند تا فعالیت هر job را متناسب با فعالیت سایر jobهای همان گروه flow_id، با در نظر گرفتن وزن درخواستی هر job نگه دارد. به این معنی که اگر یک job دارای `flow=3'، دیگری دارای `flow=2' و دیگری دارای `flow=1` باشد، تقریباً نسبتی ۳:۲:۱ در میزان اجرای یکی در مقایسه با دیگری برقرار خواهد بود.
- flow_sleep=int
- مدت زمان، به میکروثانیه، برای انتظار پس از اینکه شمارندهٔ جریان از نسبت خود فراتر رفت، پیش از تلاش مجدد برای عملیات.
- stonewall, wait_for_previous
- پیش از شروع این job، منتظر خروج jobهای قبلی در فایل job میماند. میتوان از آن برای درج نقاط ترتیبیسازی (serialization points) در فایل job استفاده کرد. یک دیوار سنگی (stone wall) همچنین به معنای شروع یک گروه گزارشدهی جدید است؛ به group_reporting مراجعه کنید. بهطور اختیاری میتوانید از `stonewall=0` برای غیرفعالسازی یا `stonewall=1` برای فعالسازی آن استفاده کنید.
- exitall
- بهطور پیشفرض، هنگامی که یک job به پایان میرسد، fio به اجرای تمام jobهای دیگر ادامه میدهد. گاهی این رفتار مطلوب نیست. تنظیم exitall در عوض باعث میشود fio به محض پایان یافتن یکی از jobهای آن گروه، تمام jobهای همان گروه را متوقف کند.
- exit_what=str
- بهطور پیشفرض، هنگامی که یک job پایان مییابد، fio به اجرای تمام jobهای دیگر ادامه میدهد. گاهی اوقات این رفتار مطلوب نیست. تنظیم exitall در عوض باعث میشود fio تمام jobهای همان گروه را خاتمه دهد. گزینهٔ exit_what به شما امکان میدهد کنترل کنید کدام jobها هنگام فعال بودن exitall متوقف شوند. مقدار پیشفرض group است. مقادیر مجاز عبارتند از:
- exec_prerun=str
- پیش از اجرای این job، دستور مشخصشده را از طریق system(3) صادر میکند. خروجی به فایلی به نام `jobname.prerun.txt' هدایت میشود.
- exec_postrun=str
- پس از تکمیل job، دستور مشخصشده را از طریق system(3) صادر میکند. خروجی به فایلی به نام `jobname.postrun.txt' هدایت میشود.
- uid=int
- به جای اجرا به عنوان کاربری که دستور را فراخوانی کرده، شناسهٔ کاربر (user ID) را قبل از اینکه نخ/فرایند (thread/process) کاری انجام دهد روی این مقدار تنظیم میکند.
- gid=int
- شناسهٔ گروه (group ID) را تنظیم میکند، uid را ببینید..SS "اعتبارسنجی (Verification)"
- verify_only
- بار کاری مشخصشده را انجام نده، فقط اعتبارسنجی کن که آیا دادهها همچنان با اجرای قبلی این بار کاری مطابقت دارند یا خیر. این گزینه امکان بررسی چندبارهٔ دادهها را در تاریخی دیگر بدون بازنویسی آن فراهم میکند. این گزینه تنها برای بارهای کاری که داده مینویسند معنی دارد و از بارهای کاری با گزینهٔ فعال time_based پشتیبانی نمیکند. گزینههای verify_write_sequence و verify_header_seed در این حالت غیرفعال خواهند بود، مگر اینکه صراحتاً فعال شوند. نوشتنهای گزارششده در خروجی هنگام تعیین این گزینه، نوشتنهای ساختگی (phantom writes) هستند، زیرا در عمل هیچ عملیات نوشتنی صادر نمیشود.
- do_verify=bool
- مرحلهٔ اعتبارسنجی را پس از مرحلهٔ نوشتن اجرا کن. تنها در صورتی معتبر است که verify تنظیم شده باشد. پیشفرض: true.
- verify=str
- هنگام نوشتن در یک فایل، fio میتواند محتویات فایل را پس از هر تکرار از کار اعتبارسنجی کند. هر روش اعتبارسنجی همچنین شامل اعتبارسنجی سرایند (header) ویژهای است که در ابتدای هر بلوک نوشته میشود. این سرایند همچنین شامل فرادادههایی مانند آفست بلوک، شمارهٔ بلوک، برچسب زمانی نوشتن بلوک، مقدار اولیهٔ بذر (seed) مورد استفاده برای تولید محتویات بافر، و غیره است. verify میتواند با گزینهٔ verify_pattern ترکیب شود. مقادیر مجاز عبارتند از:
- md5
- استفاده از جمع کنترلی md5 برای ناحیهٔ داده و ذخیرهٔ آن در سرایند هر بلوک.
- crc64
- استفاده از جمع کنترلی آزمایشی crc64 برای ناحیهٔ داده و ذخیرهٔ آن در سرایند هر بلوک.
- crc32c
- استفاده از جمع کنترلی crc32c برای ناحیهٔ داده و ذخیرهٔ آن در سرایند هر بلوک. این گزینه به طور خودکار از شتابدهندهٔ سختافزاری (مانند SSE4.2 در x86 یا افزونههای رمزنگاری CRC در ARM64) بهره خواهد برد، اما در صورت عدم وجود به crc32c نرمافزاری بازمیگردد. در صورت شتابدهی سختافزاری، معمولاً سریعترین جمع کنترلی پشتیبانیشده در fio است.
- crc32c-intel
- مترادفی برای crc32c.
- crc32
- استفاده از جمع کنترلی crc32 برای ناحیهٔ داده و ذخیرهٔ آن در سرایند هر بلوک.
- crc16
- استفاده از جمع کنترلی crc16 برای ناحیهٔ داده و ذخیرهٔ آن در سرایند هر بلوک.
- crc7
- استفاده از جمع کنترلی crc7 برای ناحیهٔ داده و ذخیرهٔ آن در سرایند هر بلوک.
- xxhash
- استفاده از xxhash به عنوان تابع جمع کنترلی. به طور کلی سریعترین جمع کنترلی نرمافزاری است که fio پشتیبانی میکند.
- sha512
- استفاده از sha512 به عنوان تابع جمع کنترلی.
- sha256
- استفاده از sha256 به عنوان تابع جمع کنترلی.
- sha1
- استفاده از sha1 بهینهسازیشده به عنوان تابع جمع کنترلی.
- sha3-224
- استفاده از sha3-224 بهینهسازیشده به عنوان تابع جمع کنترلی.
- sha3-256
- استفاده از sha3-256 بهینهسازیشده به عنوان تابع جمع کنترلی.
- sha3-384
- استفاده از sha3-384 بهینهسازیشده به عنوان تابع جمع کنترلی.
- sha3-512
- استفاده از sha3-512 بهینهسازیشده به عنوان تابع جمع کنترلی.
- meta
- این گزینه منسوخ شده است، زیرا اکنون فراداده در سرایند اعتبارسنجی عمومی گنجانده شده و اعتبارسنجی فراداده به صورت پیشفرض انجام میشود. برای اطلاعات دقیق به توضیحات تنظیمات verify مراجعه کنید. این گزینه صرفاً برای حفظ سازگاری با پیکربندیهای قدیمی نگه داشته شده است. از آن استفاده نکنید.
- pattern
- اعتبارسنجی یک الگوی دقیق. به طور معمول fio سرایندی شامل برخی اطلاعات پایه و جمع کنترلی را لحاظ میکند، اما در صورت تنظیم این گزینه، تنها الگوی خاص تعیینشده با verify_pattern اعتبارسنجی میشود.
- pattern_hdr
- اعتبارسنجی یک الگو در ترکیب با یک سرایند.
- null
- تنها وانمود به اعتبارسنجی کن. برای آزمایش بخشهای درونی با 'ioengine=null' مفید است، نه برای کاری دیگر.
از این گزینه میتوان برای آزمونهای پایداری مکرر (burn-in tests) یک سیستم استفاده کرد تا اطمینان حاصل شود که دادههای نوشتهشده به درستی بازخوانی میشوند.
اگر جهت دادهٔ مشخصشده خواندن (read) یا خواندن تصادفی (random read) باشد، fio فرض خواهد کرد که باید فایلی را که قبلاً نوشته شده است اعتبارسنجی کند. در این سناریو fio شمارهٔ بلوک نوشتهشده در سرایند را اعتبارسنجی نمیکند. بذر سرایند اعتبارسنجی نخواهد شد، مگر اینکه با تنظیم گزینهٔ verify_header_seed صراحتاً درخواست شود. توجه داشته باشید در این سناریو، بررسی بذر سرایند تنها در صورتی کار خواهد کرد که اجرای خواندن دقیقاً با اجرای نوشتن اولیه مطابقت داشته باشد.
اگر جهت داده شامل هر شکلی از نوشتن باشد، اعتبارسنجی بر روی دادههای تازه نوشتهشده انجام خواهد شد.
برای جلوگیری از خطاهای اعتبارسنجی کاذب، هنگام اعتبارسنجی دادهها با موتورهای I/O ناهمگام و عمق I/O بیشتر از ۱ (I/O depths > 1) از گزینهٔ norandommap استفاده نکنید؛ یا گزینهٔ norandommap و مولد تصادفی lfsr را با هم به کار ببرید تا از نوشتن در همان آفست با چند I/O در حال تعلیق جلوگیری شود.
- verify_offset=int
- جابهجایی سرایند اعتبارسنجی با دادهها در مکان دیگری از بلوک پیش از نوشتن. این سرایند پیش از اعتبارسنجی مجدداً به جای خود بازگردانده میشود. این مقدار باید در محدودهٔ verify_interval باشد.
- verify_interval=int
- نوشتن سرایند اعتبارسنجی با دانهبندی دقیقتر از blocksize. این سرایند برای تکههایی به اندازهٔ verify_interval نوشته خواهد شد. مقدار blocksize باید بخشپذیر بر این مقدار باشد.
- verify_pattern=str
- در صورت تنظیم، fio بافرهای I/O را با این الگو پر میکند. پیشفرض fio پر کردن با بایتهای کاملاً تصادفی است، اما گاهی اوقات پر کردن با یک الگوی مشخص به منظور اعتبارسنجی I/O مطلوب است. بسته به طول الگو، fio در هر بار ۱/۲/۳/۴ بایت از بافر را پر میکند (میتواند یک عدد دهدهی یا هگزادسیمال باشد). اگر مقدار verify_pattern بزرگتر از یک کمیت ۳۲ بیتی باشد، باید یک عدد هگزادسیمال باشد که با “0x” یا “0X” آغاز میشود. همراه با verify استفاده شود. همچنین، verify_pattern از قالب %o پشتیبانی میکند، به این معنی که برای هر بلوک، آفست نوشته شده و سپس اعتبارسنجی میشود، برای مثال:
verify_pattern=%o
یا استفاده از ترکیبی از همهچیز:
verify_pattern=0xff%o"abcd"-12
- verify_pattern_interval=bool
- ایجاد مجدد یک نمونه از verify_pattern به ازای هر verify_pattern_interval بایت. این مورد تنها زمانی مفید است که verify_pattern حاوی مشخصهٔ قالب %o باشد و میتواند برای سرعت بخشیدن به فرایند نوشتن هر بلوک روی دستگاه به همراه آفست آن استفاده شود. پیشفرض: 0 (غیرفعال).
- verify_fatal=bool
- به طور معمول fio هنگام بروز شکست در اعتبارسنجی یک بلوک، پیش از خروج کل محتویات را بررسی میکند. اگر این گزینه تنظیم شود، fio در اولین شکست مشاهدهشده از کار خارج خواهد شد. پیشفرض: false.
- verify_dump=bool
- در صورت تنظیم، محتویات هر دو بلوک دادهٔ اصلی و بلوک دادهای که از دیسک خوانده شده است را در فایلها ذخیره (dump) میکند. این کار امکان تحلیلهای بعدی را برای بررسی دقیق نوع خرابی رخداده در دادهها فراهم میسازد. به طور پیشفرض غیرفعال است.
- verify_async=int
- به طور معمول fio عملیات اعتبارسنجی I/O را به صورت درونخطی (inline) از طریق ریسهٔ ارسالکننده انجام میدهد. این گزینه یک عدد صحیح دریافت میکند که مشخصکنندهٔ تعداد ریسههای برونسپاری ناهمگام است که باید برای اعتبارسنجی I/O ایجاد شوند؛ در نتیجه fio وظیفهٔ اعتبارسنجی محتویات I/O را به یک یا چند ریسهٔ جداگانه واگذار میکند. در صورت استفاده از این گزینهٔ برونسپاری، حتی موتورهای I/O همگام نیز میتوانند از تنظیم مقدار iodepth بیشتر از ۱ بهرهمند شوند، زیرا به آنها اجازه میدهد همزمان با اجرای عملیات اعتبارسنجی، I/O در جریان داشته باشند. پیشفرض: 0 ریسهٔ ناهمگام، یعنی اعتبارسنجی به صورت ناهمگام نیست.
- verify_async_cpus=str
- به fio اعلام میکند که وابستگی پردازندهٔ (CPU affinity) تعیینشده را روی ریسههای اعتبارسنجی I/O ناهمگام اعمال کند. برای قالب مورد استفاده، cpus_allowed را ببینید.
- verify_backlog=int
- به طور معمول fio محتویات نوشتهشدهٔ کاری را که از اعتبارسنجی استفاده میکند، پس از اتمام آن کار اعتبارسنجی خواهد کرد. به عبارت دیگر، همه چیز نوشته میشود، سپس همه چیز بازخوانی و اعتبارسنجی میگردد. ممکن است به دلایل گوناگون ترجیح دهید اعتبارسنجی به طور پیوسته انجام شود. fio فرادادههای مربوط به یک بلوک I/O را در حافظه ذخیره میکند، بنابراین برای بارهای کاری اعتبارسنجی بزرگ، مقدار زیادی حافظه صرف نگهداری این فرادادهها خواهد شد. اگر این گزینه فعال باشد، fio پیش از اعتبارسنجی این بلوکها، تنها N بلوک مینویسد.
- verify_backlog_batch=int
- کنترل میکند که در صورت تنظیم verify_backlog، fio چه تعداد بلوک را اعتبارسنجی کند. اگر تنظیم نشود، پیشفرض آن مقدار verify_backlog خواهد بود (به این معنی که کل صف بازخوانی و اعتبارسنجی میشود). اگر verify_backlog_batch کمتر از verify_backlog باشد، همهٔ بلوکها اعتبارسنجی نخواهند شد؛ اگر verify_backlog_batch بزرگتر از verify_backlog باشد، برخی از بلوکها بیش از یک بار اعتبارسنجی خواهند شد..TP verify_state_save=bool هنگامی که یک شغل در طول فاز نوشتنِ یک بار کاری اعتبارسنجی خارج میشود، وضعیت جاری آن را ذخیره میکند. این ویژگی به fio اجازه میدهد در صورتی که وضعیت اعتبارسنجی برای فاز خواندن اعتبارسنجی بارگذاری شود، عملیات را تا همان نقطه بازپخش (replay) کند. قالب نام فایل تقریباً به این صورت است:
<type>-<jobname>-<jobindex>-verify.state.
مقدار <type> برای اجرای محلی برابر با "local"، برای اتصال سوکت کلاینت/سرور برابر با "sock"، و برای یک اتصال شبکهای کلاینت/سرور برابر با "ip" (برای نمونه 192.168.0.1) است. پیشفرض true است.
- verify_state_load=bool
- اگر از یک محرک خاتمه اعتبارسنجی استفاده شده باشد، fio وضعیت نوشتن جاری هر ریسه (thread) را ذخیره میکند. این مورد میتواند در زمان اعتبارسنجی استفاده شود تا fio بداند تا چه میزانی باید اعتبارسنجی را انجام دهد. بدون این اطلاعات، fio بر اساس تنظیمات موجود در فایل شغل استفادهشده، یک دور کامل اعتبارسنجی را اجرا خواهد کرد. پیشفرض false است.
- experimental_verify=bool
- فعالسازی اعتبارسنجی تجربی. اعتبارسنجی استاندارد، فرادادههای I/O را برای استفاده بعدی در طول فاز اعتبارسنجی ثبت میکند. در مقابل، اعتبارسنجی تجربی پس از فاز نوشتن فایل را بازنشانی کرده و سپس I/Oها را برای فاز اعتبارسنجی بازپخش میکند.
- verify_write_sequence=bool
- اعتبارسنجی شماره توالی نوشتن (write sequence number) در سرآیند. در سناریویی با چند شغل، ممکن است اعتبارسنجی شماره توالی نوشتن با شکست مواجه شود. غیرفعال کردن این گزینه به این معنی است که از بررسی شماره توالی نوشتن صرفنظر میشود. این کار میتواند برای آزمودن نوشتنهای اتمیک (atomic writes) مفید باشد، چرا که به این معنی است که بررسی checksum همچنان میتواند انجام شود. هنگامی که atomic فعال باشد، انتظار میرود که اعتبارسنجی checksum موفقیتآمیز باشد (در حالی که بررسی توالی نوشتن ممکن است همچنان با شکست مواجه شود).
- verify_header_seed=bool
- اعتبارسنجی مقدار seed سرآیند که برای تولید محتوای بافر استفاده شده است. در سناریوهای خاص با بارهای کاری صرفاً خواندن / اعتبارسنجی، هنگامی که norandommap همراه با اصلاحکنندههای آفست (به گزینههای readwrite و rw_sequencer مراجعه کنید) و غیره فعال است، ممکن است اعتبارسنجی seed سرآیند ناموفق باشد. غیرفعال کردن این گزینه موجب صرفنظر از بررسی seed سرآیند میشود. پیشفرض true است.
- trim_percentage=int
- تعداد بلوکهای اعتبارسنجی برای دور انداختن/trim کردن.
- trim_verify_zero=bool
- اعتبارسنجی اینکه آیا بلوکهای trim/دور انداخته شده به صورت صفر برگردانده میشوند یا خیر.
- trim_backlog=int
- اعتبارسنجی اینکه آیا بلوکهای trim/دور انداخته شده به صورت صفر برگردانده میشوند یا خیر.
- trim_backlog_batch=int
- این تعداد از بلوکهای I/O را trim کن.
وضعیت پایدار (Steady state)
- steadystate=str:float, ss=str:float
- معیار و حد آستانه را برای ارزیابی عملکرد وضعیت پایدار تعریف میکند. پارامتر اول معیار را مشخص کرده در حالی که پارامتر دوم آستانه را تعیین میکند. هنگامی که معیار برای مدت زمان مشخصشده به زیر آستانه سقوط کند، شغل متوقف خواهد شد. برای نمونه، `iops_slope:0.1%' به fio دستور میدهد که وقتی شیب رگرسیون حداقل مربعات به کمتر از ۰٫۱٪ میانگین IOPS رسید، شغل را متوقف کند. اگر group_reporting فعال باشد، این مورد بر همه شغلهای گروه اعمال خواهد شد. در زیر فهرستی از معیارهای موجود برای ارزیابی وضعیت پایدار آمده است. تمام ارزیابیها صرفاً با استفاده از دادههای پنجره جمعآوری متحرک انجام میشوند. حدود آستانه میتوانند به صورت یک مقدار ثابت یا به صورت درصدی از میانگین در پنجره جمعآوری بیان شوند.
هنگام استفاده از این ویژگی، اغلب شغلها باید شامل گزینههای time_based و runtime یا گزینه loops باشند تا fio پس از پوشش دادن کل اندازه فایل(ها) یا دستگاه(های) مشخصشده، متوقف نشود.
- iops
- جمعآوری دادههای IOPS. اگر تمام اندازهگیریهای تکی IOPS در محدوده مشخصشده از میانگین IOPS باشند، شغل را متوقف میکند (برای نمونه، `iops:2' به این معنی است که تمام مقادیر تکی IOPS باید حداکثر ۲ واحد با میانگین اختلاف داشته باشند، در حالی که `iops:0.2%' یعنی تمام مقادیر تکی IOPS برای خاتمه شغل باید در محدوده ۰٫۲٪ میانگین IOPS قرار گیرند).
- iops_slope
- جمعآوری دادههای IOPS و محاسبه شیب رگرسیون حداقل مربعات. اگر شیب به زیر حد مشخصشده سقوط کند، شغل متوقف میشود.
- bw
- جمعآوری دادههای پهنای باند. اگر تمام اندازهگیریهای تکی پهنای باند در حد مشخصشده نسبت به میانگین پهنای باند باشند، شغل متوقف میشود.
- bw_slope
- جمعآوری دادههای پهنای باند و محاسبه شیب رگرسیون حداقل مربعات. اگر شیب به زیر حد مشخصشده سقوط کند، شغل متوقف میشود.
- steadystate_duration=time, ss_dur=time
- یک پنجره متحرک با این مدت زمان برای سنجش رسیدن به وضعیت پایدار استفاده خواهد شد. دادهها در هر ss_interval جمعآوری میشوند. پیشفرض 0 است که تشخیص وضعیت پایدار را غیرفعال میکند. در صورت عدم ذکر واحد، مقدار بر حسب ثانیه تفسیر میشود.
- steadystate_ramp_time=time, ss_ramp=time
- به شغل اجازه میدهد قبل از آغاز جمعآوری داده برای بررسی معیار خاتمه وضعیت پایدار، به مدت زمان مشخصشده اجرا شود. پیشفرض 0 است. در صورت عدم ذکر واحد، مقدار بر حسب ثانیه تفسیر میشود.
- steadystate_check_interval=time, ss_interval=time
- مقادیر در طول پنجره متحرک با دورهای به اندازه این مقدار جمعآوری خواهند شد. اگر ss_interval برابر 30s و ss_dur برابر 300s باشد، ۱۰ اندازهگیری انجام خواهد شد. پیشفرض 1s است اما ممکن است همگرا نشود، به ویژه برای دستگاههای کندتر، بنابراین آن را متناسب با نیاز تنظیم کنید. در صورت عدم ذکر واحد، مقدار بر حسب ثانیه تفسیر میشود.
اندازهگیریها و گزارشدهی (Measurements and reporting)
- per_job_logs=bool
- اگر روی true تنظیم شود، fio لاگهای bw/clat/iops را با نامهای فایل منحصربهفرد برای هر شغل تولید میکند. اگر روی false تنظیم شود، شغلهایی با نامهای یکسان از یک نام فایل لاگ مشترک استفاده خواهند کرد. توجه داشته باشید که با تنظیم این گزینه روی false، فایلهای لاگ در حالت الحاق (append mode) باز میشوند و اگر فایلهای لاگ از قبل وجود داشته باشند، محتویات قبلی رونویسی نخواهند شد. پیشفرض: true.
- group_reporting
- گاهی ممکن است نمایش آمار برای گروههایی از شغلها به صورت یکپارچه به جای هر شغل منفرد مفید باشد. این امر به ویژه هنگام استفاده از numjobs صادق است؛ زیرا بررسی خروجی تکتک ریسهها/فرایندها به سرعت دشوار و غیرقابل مدیریت میشود. برای مشاهده گزارش نهایی بر اساس گروه به جای هر شغل، از group_reporting استفاده کنید. شغلهای موجود در یک فایل بخشی از همان گروه گزارشدهی خواهند بود، مگر اینکه توسط یک stonewall یا با استفاده از new_group جدا شده باشند.
نکته: هنگامی که group_reporting همراه با خروجی json استفاده میشود، ویژگیهای خاصی مختص به هر شغل وجود دارد که ممکن است بین شغلها متفاوت باشد اما معادل طبیعی در سطح گروه ندارد. نمونهها شامل kb_base، unit_base، sig_figs، thread_number، pid و job_start هستند. برای این ویژگیها، مقادیر مربوط به شغل نخست برای کل گروه ثبت میشود.
همچنین، گزینههایی مانند percentile_list و unified_rw_reporting باید میان شغلهای یک گروه گزارشدهی یکسان باشند. متغیر بودن این گونه گزینهها میان شغلهای یک گروه گزارشدهی، پیکربندی پشتیبانینشدهای است.
- new_group
- یک گروه گزارشدهی جدید آغاز میکند. رجوع کنید به: group_reporting. در صورت تعیین نشدن، تمام شغلهای درون یک فایل بخشی از همان گروه گزارشدهی خواهند بود، مگر اینکه با یک stonewall از هم جدا شوند.
- stats=bool
- به طور پیشفرض، fio نتایج خروجی نهایی را برای تمام شغلهای اجرا شده جمعآوری کرده و نمایش میدهد. اگر این گزینه روی 0 تنظیم شود، fio آن را در خروجی آمار نهایی نادیده خواهد گرفت.
- write_bw_log=str
- در صورت تعیین، یک لاگ پهنای باند برای این شغل مینویسد. میتواند برای ذخیره دادههای پهنای باند شغلها در طول دوره حیاتشان استفاده شود.
اگر هیچ آرگومان str تعیین نشود، نام پیشفرض `jobname_type.x.log' استفاده خواهد شد. حتی در صورت ارائه آرگومان، fio باز هم نوع لاگ را به آن الحاق میکند. بنابراین اگر مقدار زیر تعیین شود:
write_bw_log=foo
نام واقعی لاگ `foo_bw.x.log' خواهد بود که در آن `x' نمایه شغل است (1..N، که N تعداد شغلها است). اگر per_job_logs برابر false باشد، نام فایل شامل نمایه شغل `.x` نخواهد بود.
اسکریپت همراه fio_generate_plots از gnuplot برای تبدیل این فایلهای متنی به نمودارهای مناسب استفاده میکند. برای مشاهده نحوه ساختار دادهها در داخل فایل، به بخش LOG FILE FORMATS مراجعه کنید.
- write_lat_log=str
- همانند write_bw_log است، با این تفاوت که این گزینه به جای آن فایلهای تاخیر ارسال I/O (مثلاً `name_slat.x.log')، تکمیل (مثلاً `name_clat.x.log') و تاخیر کل (مثلاً `name_lat.x.log') ایجاد میکند. برای جزئیات قالب نام فایل به write_bw_log و برای نحوه ساختار دادهها در داخل فایلها به بخش LOG FILE FORMATS مراجعه کنید.
- write_hist_log=str
- همانند write_bw_log است، اما در عوض یک فایل هیستوگرام تاخیر تکمیل I/O (مثلاً `name_hist.x.log') مینویسد. توجه داشته باشید که این فایل خالی خواهد ماند مگر اینکه log_hist_msec نیز تنظیم شده باشد. برای جزئیات قالب نام فایل به write_bw_log و برای نحوه ساختار دادهها در فایل به بخش LOG FILE FORMATS مراجعه کنید.
- write_iops_log=str
- همانند write_bw_log است، اما در عوض یک فایل IOPS (مثلاً `name_iops.x.log`) مینویسد. به دلیل اینکه پیشفرض fio ثبت I/Oهای منفرد است، ورودی مقدار در لاگ IOPS برابر 1 خواهد بود مگر اینکه لاگگیری پنجرهای (windowed logging - رجوع کنید به log_avg_msec) فعال شده باشد. برای جزئیات در مورد قالب نام فایل به write_bw_log و برای نحوه ساختار داده در فایل به LOG FILE FORMATS مراجعه کنید..TP log_entries=int بهطور پیشفرض، fio برای هر I/O که تکمیل میشود، یک مدخل در گزارش iops، latency یا bw ثبت میکند. تعداد اولیهی مدخلهای گزارش I/O برابر ۱۰۲۴ است. هنگامی که تمام مدخلهای گزارش پر شوند، مدخلهای جدید بهصورت پویا تخصیص مییابند. این تخصیص پویای مدخلهای گزارش ممکن است تأثیر منفی بر آمارهای وابسته به زمان، مانند تأخیرهای انتهایی (tail latencies) در I/O (مثلاً صدک ۹۹٫۹ام تأخیر تکمیل) بگذارد. این گزینه امکان مشخص کردن تعداد اولیهی بزرگتری از مدخلهای گزارش را فراهم میکند تا از تخصیص مدخلها در زمان اجرا جلوگیری شود، که در نتیجه به آمارهای وابسته به زمان دقیقتری در I/O میانجامد. همچنین به log_avg_msec مراجعه کنید. پیشفرض ۱۰۲۴ است.
- log_avg_msec=int
- بهطور پیشفرض، fio برای هر I/O کاملشده یک مدخل در گزارش iops، latency یا bw ثبت میکند. هنگام نوشتن در گزارش دیسک، حجم آن میتواند بهسرعت بسیار افزایش یابد. تنظیم این گزینه fio را هدایت میکند تا بهجای آن، برای هر مدخل گزارش میانگین دادهها را در طول مدتزمان مشخصشده ثبت کند و بدین ترتیب تفکیکپذیری گزارش کاهش یابد. هنگامی که کار تکمیل میشود، fio دادههای انباشتهشدهی گزارش تأخیر را تخلیه (flush) میکند، بنابراین ممکن است بازهٔ زمانی آخرین گزارش با مقدار تعیینشده توسط این گزینه مطابقت نداشته باشد و حتی ممکن است برچسبهای زمانی تکراری ثبت شوند. همچنین log_window_value را ببینید. پیشفرض 0 است (ثبت مدخل برای تکتک I/Oها). همچنین به بخش LOG FILE FORMATS مراجعه کنید.
- log_hist_msec=int
- مشابه log_avg_msec است، اما مدخلها را برای هیستوگرامهای تأخیر تکمیل ثبت میکند. محاسبهی صدکهای تأخیر از طریق میانگینگیری بازهها با استفاده از log_avg_msec نادقیق است. تنظیم این گزینه باعث میشود fio مدخلهای هیستوگرام را در طول بازه زمانی مشخصشده ثبت کند و ضمن حفظ دقت صدکها، حجم گزارش را برای دستگاههای با IOPS بالا کاهش دهد. همچنین log_hist_coarseness و write_hist_log را ببینید. پیشفرض 0 است، به این معنی که ثبت گزارش هیستوگرام غیرفعال است.
- log_hist_coarseness=int
- عددی صحیح بین 0 تا 6 است که میزان درشتی (coarseness) تفکیکپذیری گزارشهای هیستوگرامِ فعالشده با log_hist_msec را تعیین میکند. با هر گام افزایش در میزان درشتی، fio تعداد بازهها (bins) را به نصف کاهش میدهد. پیشفرض 0 است که در آن گزارشهای هیستوگرام شامل 1216 بازهی تأخیر هستند. بخش LOG FILE FORMATS را ببینید.
- log_window_value=str, log_max_value=str
- اگر log_avg_msec تنظیم شده باشد، fio بهطور پیشفرض میانگین را در طول آن پنجره ثبت میکند. این گزینه تعیین میکند که آیا fio مقدار میانگین، بیشینه یا هر دو مقدار را در طول پنجره ثبت کند. این گزینه فقط بر ثبت تأخیر اثر میگذارد، زیرا هر دو مقدار میانگین و بیشینه برای گزارشهای iops یا bw یکسان خواهند بود. مقادیر پذیرفتهشده عبارتند از:
- log_offset=bool
- اگر این گزینه تنظیم شود، گزینههای iolog علاوه بر سایر مقادیر داده، آفست بایتی (byte offset) را نیز برای مدخل I/O شامل خواهند شد. پیشفرض 0 است، به این معنی که آفستها در گزارشها ثبت نمیشوند. همچنین بخش LOG FILE FORMATS را ببینید.
- log_prio=bool
- اگر تنظیم شود، فیلد `Command priority` در LOG FILE FORMATS مقدار اولویت و کلاس اولویت IO دستور را نشان میدهد. در غیر این صورت، این فیلد نشان میدهد که آیا دستور دارای بالاترین کلاس اولویت RT است یا خیر. همچنین بخش LOG FILE FORMATS را ببینید.
- log_issue_time=bool
- اگر تنظیم شود، گزینههای iolog زمان صدور دستور (command issue time) را علاوه بر سایر مقادیر داده برای مدخل I/O شامل خواهند شد. پیشفرض 0 است، به این معنی که زمانهای صدور دستور در گزارشها گنجانده نمیشوند. همچنین بخش LOG FILE FORMATS را ببینید. این گزینه باید همراه با write_lat_log و log_offset تنظیم شود.
- log_compression=int
- اگر تنظیم شود، fio گزارشهای I/O را در حین اجرا فشرده میکند تا ردپای مصرف حافظه را پایین نگه دارد. هنگامی که حجم یک گزارش به اندازهی مشخصشده برسد، آن قطعه (chunk) برداشته شده و در پسزمینه فشرده میشود. با توجه به اینکه گزارشهای I/O تا حد زیادی فشردهپذیر هستند، این کار برای اجراهای طولانیتر موجب صرفهجویی چشمگیری در حافظه میشود. جنبهی منفی این است که فشردهسازی مقداری از چرخههای CPU را در پسزمینه مصرف میکند و ممکن است بر اجرای اصلی تأثیر بگذارد؛ هرچند مصرف شدن بخش اعظم حافظه توسط گزارشگیری نیز همین اثر را خواهد داشت. در پایان اجرا، گزارشهای I/O با خارج کردن قطعهها از حالت فشرده و ذخیرهسازی آنها در فایل گزارشِ مشخصشده، بهصورت عادی ذخیره میشوند. این قابلیت به در دسترس بودن zlib وابسته است.
- log_compression_cpus=str
- مجموعهای از CPUها را مشخص میکند که مجاز به مدیریت فشردهسازی برخط گزارش برای کارهای I/O هستند. این گزینه میتواند تفکیک بهتری میان کارهای حساس به کارایی و عملیات فشردهسازی در پسزمینه ایجاد کند. برای قالب مورد استفاده به cpus_allowed مراجعه کنید.
- log_store_compressed=bool
- در صورت تنظیم، fio فایلهای گزارش را با قالبی فشرده ذخیره میکند. این فایلها با خود fio و با استفاده از پارامتر خط فرمان --inflate-log قابل بازگشایی هستند. فایلها با پسوند `.fz' ذخیره خواهند شد.
- log_unix_epoch=bool
- نام مستعار سازگار با گذشته برای log_alternate_epoch.
- log_alternate_epoch=bool
- در صورت تنظیم، fio برچسبهای زمانی را در فایلهای گزارش حاصل از فعالسازی write_type_log برای هر نوع گزارش، بر اساس مبدأ زمانی (epoch) ساعت مشخصشده در گزینهی log_alternate_epoch_clock_id ثبت میکند، به جای برچسبهای زمانی پیشفرض که بر پایهی صفر هستند.
- log_alternate_epoch_clock_id=int
- مشخصکنندهی clock_id مورد استفاده توسط clock_gettime برای دریافت مبدأ زمانی جایگزین در صورتی که log_alternate_epoch برقرار باشد. در غیر این صورت بیاثر است. مقدار پیشفرض 0، یا CLOCK_REALTIME است.
- block_error_percentiles=bool
- اگر تنظیم شود، خطاها را در واحدهایی با اندازه بلوک trim حاصل از نوشتنها و trimها ثبت میکند و هیستوگرامی از تعداد trimهای مورد نیاز تا رسیدن به خطا و همچنین نوع خطای رخداده را در خروجی ارائه میدهد.
- bwavgtime=int
- پهنای باند محاسبهشده را در طول مدت زمان دادهشده میانگینگیری میکند. مقدار بر حسب میلیثانیه مشخص میشود. اگر کار مذکور ثبت پهنای باند را از طریق write_bw_log نیز انجام دهد، کمترین مقدار بین این گزینه و log_avg_msec استفاده خواهد شد. پیشفرض: 500ms.
- iopsavgtime=int
- مقدار IOPS محاسبهشده را در طول مدت زمان دادهشده میانگینگیری میکند. مقدار بر حسب میلیثانیه مشخص میشود. اگر کار مذکور ثبت IOPS را از طریق write_iops_log نیز انجام دهد، کمترین مقدار بین این گزینه و log_avg_msec استفاده خواهد شد. پیشفرض: 500ms.
- disk_util=bool
- در صورت پشتیبانی پلتفرم، آمارهای بهرهوری دیسک (disk utilization) را تولید میکند. پیشفرض: true.
- disable_lat=bool
- اندازهگیری مقادیر تأخیر کل (total latency) را غیرفعال میکند. این گزینه فقط برای کاهش تعداد فراخوانیهای gettimeofday(2) کاربرد دارد، زیرا این فراخوانیها در نرخهای بسیار بالای IOPS بر کارایی تأثیر منفی میگذارند. توجه داشته باشید که برای رهایی واقعی از بخش عمدهای از این فراخوانیها، این گزینه باید همراه با disable_slat و disable_bw_measurement استفاده شود.
- disable_clat=bool
- اندازهگیری مقادیر تأخیر تکمیل (completion latency) را غیرفعال میکند. به disable_lat مراجعه کنید.
- disable_slat=bool
- اندازهگیری مقادیر تأخیر ارسال (submission latency) را غیرفعال میکند. به disable_lat مراجعه کنید.
- disable_bw_measurement=bool, disable_bw=bool
- اندازهگیری مقادیر توان عملیاتی/پهنای باند را غیرفعال میکند. به disable_lat مراجعه کنید.
- slat_percentiles=bool
- صدکهای تأخیر ارسال را گزارش میدهد. تأخیر ارسال برای ioengineهای همگام (synchronous) ثبت نمیشود.
- clat_percentiles=bool
- صدکهای تأخیر تکمیل را گزارش میدهد.
- lat_percentiles=bool
- صدکهای تأخیر کل را گزارش میدهد. تأخیر کل حاصل جمع تأخیر ارسال و تأخیر تکمیل است.
- percentile_list=float_list
- فهرست پیشفرض صدکها برای تأخیرها و هیستوگرام خطای بلوک را بازنویسی میکند. هر عدد یک مقدار ممیز شناور در بازهی (0,100] است و حداکثر طول فهرست ۲۰ است. برای جداسازی اعداد از ':' استفاده کنید. برای مثال، `--percentile_list=99.5:99.9' باعث میشود fio به ترتیب مدتزمانهای تأخیری را گزارش کند که ۹۹٫۵٪ و ۹۹٫۹٪ از تأخیرهای مشاهدهشده پایینتر از آنها بودهاند.
- significant_figures=int
- در صورت استفاده از --output-format با مقدار `normal'، ارقام بامعنی (significant figures) را روی این مقدار تنظیم میکند. مقادیر بالاتر دقت بیشتری را در واحدهای IOPS و توان عملیاتی فراهم میکنند، در حالی که مقادیر پایینتر گرد خواهند شد. حداقل مقدار مجاز ۱ و حداکثر مقدار ۱۰ است. پیشفرض ۴ است..SS "مدیریت خطا"
- exitall_on_error
- هنگامی که یک کار با خطا پایان مییابد، بقیه را خاتمه بده. حالت پیشفرض، انتظار برای اتمام هر کار است.
- continue_on_error=str
- بهطور معمول fio در اولین شکست مشاهدهشده از کار خارج میشود. اگر این گزینه تنظیم شده باشد، fio در صورت بروز یک «خطای غیرمهلک» (EIO یا EILSEQ) کار را تا زمانی که زمان اجرا به پایان برسد یا اندازه I/O مشخصشده کامل شود، ادامه میدهد. اگر از این گزینه استفاده شود، دو آمار دیگر ضمیمه میشوند: تعداد کل خطاها و اولین خطا. فیلد خطای ارائهشده در آمارها، اولین خطایی است که در طول اجرا رخ داده است.
نکته: هنگام استفاده از I/O میانگیرشده (بافری)، ممکن است خطای نوشتن از سوی دستگاه توسط fio متوجه نشود، زیرا فراخوانی سیستمی write() (یا مشابه آن) صرفاً صفحات هسته را کثیف (dirty) میکند، مگر اینکه از `sync` یا `direct` استفاده شود. خطاهای I/O دستگاه زمانی رخ میدهند که دادههای کثیف واقعاً بر روی دیسک نوشته شوند. اگر نوشتنهای کاملاً همگام مطلوب نیستند، میتوان از `fsync` یا `fdatasync` نیز استفاده کرد. این مورد مختص نوشتنها است، زیرا خواندنها همیشه همگام (synchronous) هستند.
مقادیر مجاز عبارتند از:
- none
- خروج در صورت بروز هرگونه خطای I/O یا اعتبارسنجی (verify).
- read
- ادامه دادن در خطاهای خواندن، خروج در سایر موارد.
- write
- ادامه دادن در خطاهای نوشتن، خروج در سایر موارد.
- io
- ادامه دادن در صورت بروز هرگونه خطای I/O، خروج در سایر موارد.
- verify
- ادامه دادن در خطاهای اعتبارسنجی، خروج در سایر موارد.
- all
- ادامه دادن در تمام خطاها.
- 0
- نام مستعار سازگار با گذشته برای 'none'.
- 1
- نام مستعار سازگار با گذشته برای 'all'.
- ignore_error=str
- گاهی اوقات میخواهید در حین آزمایش برخی خطاها را نادیده بگیرید؛ در این حالت میتوانید بهجای اینکه تنها قادر به نادیده گرفتن «خطای غیرمهلک» پیشفرض با استفاده از continue_on_error باشید، فهرستی از خطاها را برای هر نوع خطا مشخص کنید. در `ignore_error=READ_ERR_LIST,WRITE_ERR_LIST,VERIFY_ERR_LIST`، خطاها برای یک نوع خطای دادهشده با ':' از یکدیگر جدا میشوند. خطا میتواند یک نماد ('ENOSPC' ،'ENOMEM') یا یک عدد صحیح باشد. مثال:
ignore_error=EAGAIN,ENOSPC:122
این گزینه EAGAIN را از READ، و ENOSPC و 122(EDQUOT) را از WRITE نادیده خواهد گرفت. این گزینه با بازنویسی کردن continue_on_error با فهرست خطاها برای هر نوع خطا (در صورت وجود) کار میکند.
- error_dump=bool
- در صورت تنظیم، تمام خطاها حتی اگر غیرمهلک باشند تخلیه (dump) میشوند؛ بهطور پیشفرض true است. در صورت غیرفعال بودن، تنها خطاهای مهلک تخلیه خواهند شد.
اجرای بارهای کاری از پیش تعریفشده
ابزار fio شامل نمایههای از پیش تعریفشدهای است که بارهای کاری I/O تولیدشده توسط سایر ابزارها را شبیهسازی میکنند.
- profile=str
- بار کاری از پیش تعریفشده برای اجرا. نمایههای فعلی عبارتند از:
برای مشاهده گزینههای تکمیلی یک نمایه، پس از مشخص کردن نمایه از --cmdhelp استفاده کنید. برای مثال:
- $ fio --profile=act --cmdhelp
گزینههای نمایه Act
- device-names=str
- دستگاههای مورد استفاده.
- load=int
- ضریب بار ACT. پیشفرض: 1.
- test-duration=time
- مدت زمان اجرای کل آزمایش. در صورت حذف واحد، مقدار برحسب ثانیه در نظر گرفته میشود. پیشفرض: 24h.
- threads-per-queue=int
- تعداد نخهای I/O خواندن بهازای هر دستگاه. پیشفرض: 8.
- read-req-num-512-blocks=int
- تعداد بلوکهای 512 بایتی برای خواندن در هر نوبت. پیشفرض: 3.
- large-block-op-kbytes=int
- اندازه عملیاتهای بلوک بزرگ برحسب KiB (نوشتنها). پیشفرض: 131072.
- prep
- تنظیم برای اجرای فاز آمادهسازی (prep) در ACT..SS "گزینههای پروفایل Tiobench"
- size=str
- اندازه به مبیبایت (MiB).
- block=int
- اندازه بلوک به بایت. پیشفرض: 4096.
- numruns=int
- تعداد دفعات اجرا.
- dir=str
- دایرکتوری آزمون.
- threads=int
- تعداد نخها.
خروجی (OUTPUT)
دستور fio خروجی بسیار زیادی تولید میکند. در حین اجرا، fio وضعیت کارهای ایجادشده را نمایش خواهد داد. نمونهای از آن بدین صورت است:
Jobs: 1 (f=1): [_(1),M(1)][24.8%][r=20.5MiB/s,w=23.5MiB/s][r=82,w=94 IOPS][eta 01m:31s]
نویسههای درون نخستین جفت قلاب، وضعیت فعلی هر نخ را مشخص میکنند. اولین نویسه، مربوط به اولین کار تعریفشده در فایل کار (job file) است، و به همین ترتیب ادامه مییابد. مقادیر ممکن (به ترتیب چرخه حیات معمول) عبارتند از:
- P
- نخ برپا شده، اما شروع نشده است.
- C
- نخ ایجاد شد.
- I
- نخ مقداردهی اولیه شده، در حال انتظار یا تولید دادههای مورد نیاز است.
- p
- نخ در حال اجرای پیشخوانش فایل(ها) است.
- /
- نخ در دوره افزایش تدریجی بار (ramp period) است.
- R
- در حال اجرا، انجام خواندنهای متوالی.
- r
- در حال اجرا، انجام خواندنهای تصادفی.
- W
- در حال اجرا، انجام نوشتنهای متوالی.
- w
- در حال اجرا، انجام نوشتنهای تصادفی.
- M
- در حال اجرا، انجام خواندن/نوشتنهای متوالی ترکیبی.
- m
- در حال اجرا، انجام خواندن/نوشتنهای تصادفی ترکیبی.
- D
- در حال اجرا، انجام trimهای متوالی.
- d
- در حال اجرا، انجام trimهای تصادفی.
- F
- در حال اجرا، در حال حاضر منتظر فراخوانی fsync(2).
- V
- در حال اجرا، در حال بررسی صحت (verification) دادههای نوشتهشده.
- f
- نخ در حال اتمام است.
- E
- نخ پایان یافته، اما هنوز توسط نخ اصلی جمعآوری (reap) نشده است.
- -
- نخ جمعآوری شد.
- X
- نخ جمعآوری شد، با خطا خاتمه یافته است.
- K
- نخ جمعآوری شد، به دلیل دریافت سیگنال خاتمه یافته است.
دستور fio رشته مربوط به وضعیت نخها را فشرده میکند تا فضای بیش از حد نیاز در خط فرمان اشغال نشود. برای نمونه، اگر ۱۰ خواننده و ۱۰ نویسنده در حال اجرا داشته باشید، خروجی به این صورت خواهد بود:
Jobs: 20 (f=20): [R(10),W(10)][4.0%][r=20.5MiB/s,w=23.5MiB/s][r=82,w=94 IOPS][eta 57m:36s]
توجه داشته باشید که رشته وضعیت به ترتیب نمایش داده میشود، بنابراین میتوان دریافت کدامیک از کارها در حال حاضر چه کاری انجام میدهند. در مثال بالا، این بدان معناست که کارهای 1--10 خواننده و 11--20 نویسنده هستند.
سایر مقادیر تا حد زیادی مشخص و واضح هستند -- تعداد نخهایی که در حال حاضر در حال اجرا بوده و مشغول انجام I/O هستند، تعداد فایلهای باز کنونی (f=)، درصد تخمینی تکمیل، نرخ I/O از زمان بررسی قبلی (ابتدا سرعت خواندن فهرست میشود، سپس سرعت نوشتن و در صورت وجود سرعت trim) از نظر پهنای باند و IOPS، و زمان باقیمانده تا تکمیل گروه در حال اجرای فعلی. تخمین زمان اجرای گروههای بعدی (در صورت وجود) غیرممکن است.
هنگامی که اجرای fio به پایان برسد (یا توسط Ctrl-C متوقف شود)، دادهها را به ترتیب برای هر نخ، گروهی از نخها و دیسکها نشان خواهد داد. برای هر نخ کلی (یا گروه)، خروجی به این شکل خواهد بود:
Client1: (groupid=0, jobs=1): err= 0: pid=16109: Sat Jun 24 12:07:54 2017
write: IOPS=88, BW=623KiB/s (638kB/s)(30.4MiB/50032msec)
slat (nsec): min=500, max=145500, avg=8318.00, stdev=4781.50
clat (usec): min=170, max=78367, avg=4019.02, stdev=8293.31
lat (usec): min=174, max=78375, avg=4027.34, stdev=8291.79
clat percentiles (usec):
| 1.00th=[ 302], 5.00th=[ 326], 10.00th=[ 343], 20.00th=[ 363],
| 30.00th=[ 392], 40.00th=[ 404], 50.00th=[ 416], 60.00th=[ 445],
| 70.00th=[ 816], 80.00th=[ 6718], 90.00th=[12911], 95.00th=[21627],
| 99.00th=[43779], 99.50th=[51643], 99.90th=[68682], 99.95th=[72877],
| 99.99th=[78119]
bw ( KiB/s): min= 532, max= 686, per=0.10%, avg=622.87, stdev=24.82, samples= 100
iops : min= 76, max= 98, avg=88.98, stdev= 3.54, samples= 100
lat (usec) : 250=0.04%, 500=64.11%, 750=4.81%, 1000=2.79%
lat (msec) : 2=4.16%, 4=1.84%, 10=4.90%, 20=11.33%, 50=5.37%
lat (msec) : 100=0.65%
cpu : usr=0.27%, sys=0.18%, ctx=12072, majf=0, minf=21
IO depths : 1=85.0%, 2=13.1%, 4=1.8%, 8=0.1%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwt: total=0,4450,0, short=0,0,0, dropped=0,0,0
latency : target=0, window=0, percentile=100.00%, depth=8
نام کار (یا نام نخستین کار در هنگام استفاده از group_reporting) به همراه شناسه گروه (group id)، تعداد کارهای تجمیعشده، آخرین شناسه خطای مشاهدهشده (که در صورت عدم وجود خطا 0 است)، pid/tid آن نخ و زمان تکمیل کار/گروه چاپ میشود. در ادامه آمار I/O برای هر جهت داده انجامشده آمده است (در مثال بالا نوشتنها را نشان میدهد). به ترتیب فهرستشده، آنها نمایانگر موارد زیر هستند:
- read/write/trim
- رشته قبل از دونقطه نشان میدهد آمار مربوط به کدام جهت I/O است. IOPS میانگین I/Oهای انجامشده در هر ثانیه است. BW نرخ میانگین پهنای باند است که به این صورت نشان داده میشود: مقدار در قالب توان ۲ (مقدار در قالب توان ۱۰). دو مقدار پایانی نشاندهنده: (کل I/O انجامشده در قالب توان ۲ / runtime آن نخ) است.
- slat
- تأخیر ارسال (Submission latency) که در آن min کمترین، max بیشترین، avg میانگین و stdev انحراف معیار است. این مدتزمانی است که ارسال I/O به طول انجامیده است. برای I/O همگام (sync) این سطر نمایش داده نمیشود چرا که slat در واقع همان تأخیر تکمیل است (زیرا در آنجا صفبندی/تکمیل یک عملیات واحد است). این مقدار میتواند به نانوثانیه، میکروثانیه یا میلیثانیه باشد --- fio مناسبترین مبنا را انتخاب کرده و چاپ میکند (در مثال بالا نانوثانیه بهترین مقیاس بود). نکته: در حالت --minimal تأخیرها همیشه بر حسب میکروثانیه بیان میشوند.
- clat
- تأخیر
تکمیل (Completion latency).
با همان
نامهای
موجود در slat،
این مقدار
نشاندهنده
زمان از
ارسال تا
تکمیل
بخشهای I/O
است. برای I/O
همگام، clat
معمولاً
برابر (یا
بسیار
نزدیک به) 0
خواهد بود،
زیرا زمان
ارسال تا
تکمیل
اساساً فقط
زمان
پردازنده (CPU)
است (I/O پیش از
این انجام
شده است،
توضیح slat را
ببینید).
برای موتورهای عملیات فایل و دایرکتوری، clat نشاندهنده زمان لازم برای تکمیل یک عملیات روی فایل یا دایرکتوری است.
- filecreate engine:هزینه زمانی برای ایجاد یک فایل جدید
- filestat engine:هزینه زمانی برای بررسی یک فایل موجود
- filedelete engine:هزینه زمانی برای حذف یک فایل
- dircreate engine:هزینه زمانی برای ایجاد یک دایرکتوری جدید
- dirstat engine:هزینه زمانی برای بررسی یک دایرکتوری موجود
- dirdelete engine:هزینه زمانی برای حذف یک دایرکتوری
- lat
- تأخیر کل (Total latency). با همان نامهای slat و clat، این مقدار نشاندهنده مدتزمان از هنگامی است که fio واحد I/O را ایجاد کرده تا تکمیل عملیات I/O.
- bw
- آمار پهنای
باند بر
اساس
اندازهگیریها
در
بازههای
زمانی
گسسته. fio
بهطور
پیوسته
بایتهای
منتقلشده
و
عملیاتهای
I/O
تکمیلشده
را پایش
میکند.
بهطور
پیشفرض fio
پهنای باند
را در هر
بازه
نیمثانیهای
محاسبه
کرده (به bwavgtime
مراجعه
کنید) و
آمار
توصیفی
مربوط به
اندازهگیریها
را در اینجا
گزارش
میدهد. این
بخش
نامهایی
مشابه با
آمارهای xlat
دارد، اما
تعداد
نمونههای
گرفتهشده
(samples) و درصد
تقریبی از
کل پهنای
باند
تجمیعی را
که این نخ
در گروه خود
دریافت
کرده است (per)
نیز شامل
میشود. این
مقدار آخر
تنها زمانی
واقعاً
کاربردی
است که
نخهای این
گروه روی یک
دیسک
باشند،
زیرا در این
حالت آنها
برای
دسترسی به
دیسک با
یکدیگر
رقابت
میکنند.
برای موتورهای عملیات فایل و دایرکتوری، bw بیمعنی است..TP iops آمار IOPS بر اساس اندازهگیریها در بازههای زمانی گسسته. برای جزئیات بیشتر به توضیحات bw در بالا مراجعه کنید. برای کنترل مدتزمان بازهها iopsavgtime را ببینید. همان مقادیر گزارششده برای bw در اینجا نیز بهجز درصد گزارش میشوند.
برای موتورهای عملیات فایل و دایرکتوری، iops اساسیترین شاخص برای نشان دادن کارایی است. این شاخص بیانگر تعداد فایلها یا دایرکتوریهایی است که در هر ثانیه میتوان روی آنها عملیات انجام داد.
- filecreate engine:تعداد فایلهایی که میتوان در هر ثانیه ایجاد کرد
- filestat engine:تعداد فایلهایی که میتوان در هر ثانیه بررسی (look up) کرد
- filedelete engine:تعداد فایلهایی که میتوان در هر ثانیه حذف کرد
- dircreate engine:تعداد دایرکتوریهایی که میتوان در هر ثانیه ایجاد کرد
- dirstat engine:تعداد دایرکتوریهایی که میتوان در هر ثانیه بررسی (look up) کرد
- dirdelete engine:تعداد دایرکتوریهایی که میتوان در هر ثانیه حذف کرد
- lat (nsec/usec/msec)
- توزیع تأخیرهای تکمیل I/O. این زمان از هنگامی که I/O از fio خارج میشود تا هنگامی که تکمیل میگردد را شامل میشود. بر خلاف بخشهای جداگانه read/write/trim در بالا، دادههای این بخش و بخشهای باقیمانده برای تمام I/Oهای گروه گزارش اعمال میشوند. 250=0.04% بدان معناست که 0.04% از I/Oها در کمتر از 250us تکمیل شدهاند. 500=64.11% بدان معناست که 64.11% از I/Oها برای تکمیل بین 250 تا 499us زمان بردهاند.
- cpu
- میزان استفاده از CPU. زمان کاربر (user) و سیستم (system)، به همراه تعداد تعویضهای زمینه (context switches) که این رشته پشت سر گذاشته است، استفاده از زمان سیستم و کاربر، و در نهایت تعداد نقصهای صفحه (page faults) بزرگ و کوچک. ارقام استفاده از CPU میانگین کارهای آن گروه گزارش هستند، در حالی که شمارندههای تعویض زمینه و نقصهای صفحه جمع زده میشوند.
- IO depths
- توزیع عمقهای I/O در طول چرخه حیات کار (job). اعداد به توانهایی از ۲ تقسیم شدهاند و هر مدخل، عمقها را از آن مقدار تا مقادیر کمتر از مدخل بعدی پوشش میدهد -- به عنوان مثال، =16 عمقهای ۱۶ تا ۳۱ را در بر میگیرد. توجه داشته باشید که بازه پوششدادهشده توسط یک مدخل توزیع عمق میتواند با بازه پوششدادهشده توسط مدخل توزیع معادل submit/complete متفاوت باشد.
- IO submit
- چه تعداد بخش I/O در یک فراخوانی ثبت (submit call) منفرد ارسال شدهاند. هر مدخل آن مقدار و کمتر از آن تا مدخل قبلی را نشان میدهد -- برای مثال، 16=100% به این معناست که در هر فراخوانی ثبت، هر رقمی بین ۹ تا ۱۶ مورد I/O ثبت شده است. توجه داشته باشید که بازه پوششدادهشده توسط یک مدخل توزیع submit میتواند با بازه پوششدادهشده توسط مدخل توزیع عمق معادل متفاوت باشد.
- IO complete
- مشابه مقدار submit در بالا، اما در عوض برای تکمیلها.
- IO issued rwt
- تعداد درخواستهای read/write/trim صادرشده، و این که چه تعداد از آنها کوتاه بوده یا رها (dropped) شدهاند.
- IO latency
- این مقادیر برای latency_target و گزینههای مرتبط هستند. هنگامی که این گزینهها به کار گرفته شوند، این بخش عمق I/O مورد نیاز برای برآورده ساختن هدف تأخیر مشخصشده را توصیف میکند.
پس از فهرست شدن هر کلاینت، آمار گروه چاپ میشود. خروجی به این شکل خواهد بود:
Run status group 0 (all jobs): READ: bw=20.9MiB/s (21.9MB/s), 10.4MiB/s-10.8MiB/s (10.9MB/s-11.3MB/s), io=64.0MiB (67.1MB), run=2973-3069msec WRITE: bw=1231KiB/s (1261kB/s), 616KiB/s-621KiB/s (630kB/s-636kB/s), io=64.0MiB (67.1MB), run=52747-53223msec
برای هر جهت داده این موارد چاپ میشوند:
- bw
- پهنای باند تجمیعی رشتهها در این گروه و در ادامه کمترین و بیشترین پهنای باند تمام رشتهها در این گروه. مقادیر خارج از براکت در قالب توان ۲ و مقادیر داخل آن معادل همان مقدار در قالب توان ۱۰ هستند.
- io
- مجموع کل I/O انجامشده توسط تمام رشتهها در این گروه. قالب خروجی مشابه bw است.
- run
- کوتاهترین و طولانیترین زمان اجرای رشتهها در این گروه.
و در نهایت، آمار دیسک چاپ میشود. این ویژگی مخصوص لینوکس است. خروجی به این صورت خواهد بود:
Disk stats (read/write): sda: ios=16398/16511, sectors=32321/65472, merge=30/162, ticks=6853/819634, in_queue=826487, util=100.00%
هر مقدار برای هر دو عملیات خواندن و نوشتن چاپ میشود، که خواندن اول میآید. این اعداد بیانگر موارد زیر هستند:
- ios
- تعداد I/Oهای انجامشده توسط تمام گروهها.
- merge
- تعداد ادغامهای انجامشده توسط زمانبند I/O.
- ticks
- تعداد تیکهایی که دیسک را مشغول نگه داشتهایم.
- in_queue
- کل زمان صرفشده در صف دیسک.
- util
- میزان بهرهوری از دیسک. مقدار 100% به این معنی است که دیسک را همواره مشغول نگه داشتهایم، 50% به معنای دیسکی است که نیمی از زمان بیکار بوده است.
همچنین این امکان وجود دارد که از fio بخواهید بدون متوقف کردن کار، خروجی فعلی را در حین اجرا تخلیه (dump) کند. برای این کار، سیگنال USR1 را به fio ارسال کنید. همچنین میتوانید با استفاده از پارامتر --status-interval، یا با ایجاد فایلی در `/tmp' با نام `fio-dump-status'، خروجیهای دورهای دریافت کنید. اگر fio این فایل را ببیند، آن را حذف (unlink) کرده و وضعیت فعلی خروجی را تخلیه میکند..SH "خروجی موجز (TERSE OUTPUT)" برای کاربردهای اسکریپتی که در آنها معمولاً مایلید جداول یا نمودارهایی از نتایج ایجاد کنید، fio میتواند نتایج را در قالبی جداشده با نقطه-ویرگول خروجی دهد. این قالب یک خط طولانی از مقادیر است، مانند:
2;card0;0;0;7139336;121836;60004;1;10109;27.932460;116.933948;220;126861;3495.446807;1085.368601;226;126864;3523.635629;1089.012448;24063;99944;50.275485%;59818.274627;5540.657370;7155060;122104;60004;1;8338;29.086342;117.839068;388;128077;5032.488518;1234.785715;391;128085;5061.839412;1236.909129;23436;100928;50.287926%;59964.832030;5644.844189;14.595833%;19.394167%;123706;0;7313;0.1%;0.1%;0.1%;0.1%;0.1%;0.1%;100.0%;0.00%;0.00%;0.00%;0.00%;0.00%;0.00%;0.01%;0.02%;0.05%;0.16%;6.04%;40.40%;52.68%;0.64%;0.01%;0.00%;0.01%;0.00%;0.00%;0.00%;0.00%;0.00% A description of this job goes here.
توضیحات کار (در صورت ارائه)، برای خروجی موجز نگارش ۲ (terse v2) در خط دوم میآید. در سایر نگارشهای خروجی موجز، در همان خط قرار میگیرد.
برای فعال کردن خروجی موجز، از گزینههای خط فرمان --minimal یا '--output-format=terse' استفاده کنید. نخستین مقدار، نگارش قالب خروجی موجز است. اگر خروجی بنا به دلیلی مجبور به تغییر باشد، این عدد ۱ واحد افزایش مییابد تا بیانگر آن تغییر باشد.
به صورت تفکیکشده، قالب به شرح زیر است (توضیحات درون براکتها نشان میدهند که یک فیلد از چه زمانی اضافه شده یا اینکه مختص نگارش خاصی از خروجی موجز است):
نگارش موجز (terse version)، نگارش fio [v3]، نام کار (jobname)، شناسه گروه (groupid)، خطا (error)
وضعیت خواندن (READ):
کل IO (KiB)، پهنای باند (KiB/sec)، IOPS، مدت زمان اجرا (msec) تأخیر ارسال (Submission latency): min, max, mean, stdev (usec) تأخیر تکمیل (Completion latency): min, max, mean, stdev (usec) صدکهای تأخیر تکمیل: ۲۰ فیلد (پایین را ببینید) تأخیر کل (Total latency): min, max, mean, stdev (usec) پهنای باند (KiB/s): min, max، درصد تجمیعی از کل، mean, stdev، تعداد نمونهها [v5] IOPS [v5]: min, max, mean, stdev، تعداد نمونهها
وضعیت نوشتن (WRITE):
کل IO (KiB)، پهنای باند (KiB/sec)، IOPS، مدت زمان اجرا (msec) تأخیر ارسال (Submission latency): min, max, mean, stdev (usec) تأخیر تکمیل (Completion latency): min, max, mean, stdev (usec) صدکهای تأخیر تکمیل: ۲۰ فیلد (پایین را ببینید) تأخیر کل (Total latency): min, max, mean, stdev (usec) پهنای باند (KiB/s): min, max، درصد تجمیعی از کل، mean, stdev، تعداد نمونهها [v5] IOPS [v5]: min, max, mean, stdev، تعداد نمونهها
وضعیت TRIM [همه نگارشها به جز نگارش ۳]:
فیلدها مشابه وضعیت READ/WRITE هستند.
مصرف پردازنده (CPU):
کاربر (user)، سیستم (system)، تعویضهای زمینه (context switches)، خطاهای عمده (major faults)، خطاهای جزئی (minor faults)
عمقهای I/O (I/O depths):
<=1, 2, 4, 8, 16, 32, >=64
تأخیرهای I/O بر حسب میکروثانیه:
<=2, 4, 10, 20, 50, 100, 250, 500, 750, 1000
تأخیرهای I/O بر حسب میلیثانیه:
<=2, 4, 10, 20, 50, 100, 250, 500, 750, 1000, 2000, >=2000
بهرهوری دیسک [نگارش ۳]:
نام دیسک، I/Oهای خواندن، I/Oهای نوشتن، ادغامهای خواندن، ادغامهای نوشتن، تیکهای خواندن، تیکهای نوشتن، زمان سپریشده در صف، درصد بهرهوری دیسک
اطلاعات تکمیلی (وابسته به continue_on_error، پیشفرض خاموش):
تعداد کل خطاها، کد اولین خطا
اطلاعات تکمیلی (وابسته به تنظیم بودن description):
توضیحات متنی
صدکهای تأخیر تکمیل میتوانند دستهای شامل حداکثر ۲۰ مجموعه باشند، بنابراین برای خروجی موجز، fio همه آنها را مینویسد. هر فیلد به این شکل خواهد بود:
1.00%=6112
که نشاندهنده صدک Xاُم و تأخیر بر حسب 'usec' مرتبط با آن است.
برای بهرهوری دیسک (Disk utilization)، تمام دیسکهای استفادهشده توسط fio نشان داده میشوند. بنابراین برای هر دیسک، یک بخش بهرهوری دیسک وجود خواهد داشت.
در زیر یک خط منفرد حاوی نامهای کوتاه برای هر یک از فیلدها در خروجی مختصر (minimal) نگارش ۳ آمده است که با نقطه-ویرگول از یکدیگر جدا شدهاند:
terse_version_3;fio_version;jobname;groupid;error;read_kb;read_bandwidth_kb;read_iops;read_runtime_ms;read_slat_min_us;read_slat_max_us;read_slat_mean_us;read_slat_dev_us;read_clat_min_us;read_clat_max_us;read_clat_mean_us;read_clat_dev_us;read_clat_pct01;read_clat_pct02;read_clat_pct03;read_clat_pct04;read_clat_pct05;read_clat_pct06;read_clat_pct07;read_clat_pct08;read_clat_pct09;read_clat_pct10;read_clat_pct11;read_clat_pct12;read_clat_pct13;read_clat_pct14;read_clat_pct15;read_clat_pct16;read_clat_pct17;read_clat_pct18;read_clat_pct19;read_clat_pct20;read_tlat_min_us;read_lat_max_us;read_lat_mean_us;read_lat_dev_us;read_bw_min_kb;read_bw_max_kb;read_bw_agg_pct;read_bw_mean_kb;read_bw_dev_kb;write_kb;write_bandwidth_kb;write_iops;write_runtime_ms;write_slat_min_us;write_slat_max_us;write_slat_mean_us;write_slat_dev_us;write_clat_min_us;write_clat_max_us;write_clat_mean_us;write_clat_dev_us;write_clat_pct01;write_clat_pct02;write_clat_pct03;write_clat_pct04;write_clat_pct05;write_clat_pct06;write_clat_pct07;write_clat_pct08;write_clat_pct09;write_clat_pct10;write_clat_pct11;write_clat_pct12;write_clat_pct13;write_clat_pct14;write_clat_pct15;write_clat_pct16;write_clat_pct17;write_clat_pct18;write_clat_pct19;write_clat_pct20;write_tlat_min_us;write_lat_max_us;write_lat_mean_us;write_lat_dev_us;write_bw_min_kb;write_bw_max_kb;write_bw_agg_pct;write_bw_mean_kb;write_bw_dev_kb;cpu_user;cpu_sys;cpu_csw;cpu_mjf;cpu_minf;iodepth_1;iodepth_2;iodepth_4;iodepth_8;iodepth_16;iodepth_32;iodepth_64;lat_2us;lat_4us;lat_10us;lat_20us;lat_50us;lat_100us;lat_250us;lat_500us;lat_750us;lat_1000us;lat_2ms;lat_4ms;lat_10ms;lat_20ms;lat_50ms;lat_100ms;lat_250ms;lat_500ms;lat_750ms;lat_1000ms;lat_2000ms;lat_over_2000ms;disk_name;disk_read_iops;disk_write_iops;disk_read_merges;disk_write_merges;disk_read_ticks;write_ticks;disk_queue_time;disk_util
در حالت
کلاینت/سرور
(کارخواه/کارساز)،
خروجی موجز
با آنچه
هنگام
اجرای محلی
کارها
نمایش
مییابد
متفاوت است.
دادههای
بهرهوری
دیسک از
خروجی موجز
استاندارد
حذف
میشوند و
در نگارش ۳ و
بالاتر، در
یک خط
جداگانه در
پایان هر
چرخه
گزارشدهی
موجز ظاهر
میشوند..SH
"خروجی JSON (JSON OUTPUT)"
قالب خروجی
json
بهگونهای
طراحی شده
است که هم
برای انسان
خوانا باشد
و هم برای
تجزیه
خودکار
مناسب باشد.
بخشهای آن
در بیشتر
موارد
همانند
بخشهای
خروجی normal
هستند.
مقدار runtime بر
حسب
میلیثانیه
گزارش
میشود و
مقدار bw بر
حسب
واحدهای
۱۰۲۴ بایت
در ثانیه
گزارش
میگردد.
خروجی JSON+ (JSON+ OUTPUT)
قالب خروجی json+ همسان با قالب خروجی json است، با این تفاوت که رونوشت کاملی از بازههای تاخیر تکمیل (completion latency bins) را میافزاید. هر شیء bins شامل مجموعهای از جفتهای (کلید، مقدار) است که در آنها کلیدها مدتزمانهای تاخیر هستند و مقادیر شمارش میکنند که چه تعداد I/O دارای تاخیر تکمیلی با آن مدتزمان متناظر بودهاند. برای نمونه، این مورد را در نظر بگیرید:
"bins" : { "87552" : 1, "89600" : 1, "94720" : 1, "96768" : 1, "97792" : 1, "99840" : 1, "100864" : 2, "103936" : 6, "104960" : 534, "105984" : 5995, "107008" : 7529, ... }
این دادهها نشان میدهند که یک I/O برای تکمیل به 87,552ns، دو I/O برای تکمیل به 100,864ns و ۷۵۲۹ مورد I/O برای تکمیل به 107,008ns زمان نیاز داشتهاند.
همچنین همراه با fio یک اسکریپت پایتون به نام fio_jsonplus_clat2csv ارائه شده است که خروجی json+ را دریافت کرده و دادههای تاخیر را در قالب CSV و مناسب برای رسم نمودار تولید میکند.
مدتزمانهای تاخیر در واقع نشاندهنده نقاط میانی بازههای تاخیر هستند. برای جزئیات بیشتر به `stat.h' در سورسکد fio مراجعه کنید.
قالب فایل ردگیری (TRACE FILE FORMAT)
دو قالب فایل ردگیری وجود دارد که ممکن است با آنها مواجه شوید. قالب قدیمیتر (v1) از نسخه 1.20-rc3 (مارس ۲۰۰۸) پشتیبانی نمیشود. با این حال در ادامه شرح داده خواهد شد تا در صورتی که با یک فایل ردگیری قدیمی مواجه شدید، بتوانید آن را درک کنید.
در هر حال، فایل ردگیری یک فایل متنی ساده است که در هر خط آن یک عملیات منفرد قرار دارد.
- قالب فایل ردگیری نسخه ۱ (Trace file format v1)
- هر خط نشاندهنده یک عملیات I/O منفرد در قالب زیر است:
rw, offset, length
که در آن `rw=0/1' برای خواندن/نوشتن (read/write) بوده و مقادیر `offset' و `length' بر حسب بایت هستند.
این قالب در نسخههای fio >= 1.20-rc3 پشتیبانی نمیشود.
- قالب فایل ردگیری نسخه ۲ (Trace file format v2)
- نسخه دوم قالب فایل ردگیری در fio نسخه ۱.۱۷ اضافه شد. این نسخه امکان دسترسی به بیش از یک فایل در هر ردگیری را فراهم میسازد و مجموعه بزرگتری از عملیاتهای ممکن روی فایل را در بر دارد.
خط نخست فایل ردگیری باید این باشد:
"fio version 2 iolog"
به دنبال آن خطوطی در دو قالب مختلف میتوانند بیایند که در زیر شرح داده شدهاند.
قالب مدیریت فایل (The file management format):
مقدار `filename' به صورت یک مسیر مطلق مشخص میشود. مقدار `action' میتواند یکی از این موارد باشد:
قالب عملیات I/O فایل (The file I/O action format):
مقدار `filename' به صورت یک مسیر مطلق داده میشود، و پیش از آنکه بتوان از آن در این قالب استفاده کرد باید افزوده (add) و باز (open) شده باشد. مقادیر `offset' و `length' بر حسب بایت مشخص میشوند. مقدار `action' میتواند یکی از این موارد باشد:
- wait
- به مدت `offset' میکروثانیه منتظر میماند. هر مقداری کمتر از ۱۰۰ نادیده گرفته میشود. زمان نسبت به عبارت `wait' قبلی سنجیده میشود. توجه داشته باشید که عملیات `wait` از نسخه ۳ به بعد مجاز نیست، چرا که رفتار مشابه را میتوان با استفاده از برچسبهای زمانی (timestamps) به دست آورد.
- read
- خواندن `length' بایت با شروع از `offset'.
- write
- نوشتن `length' بایت با شروع از `offset'.
- sync
- اجرای fsync(2) روی فایل.
- datasync
- اجرای fdatasync(2) روی فایل.
- trim
- اعمال trim روی فایل دادهشده از `offset' مشخص به میزان `length' بایت.
- قالب فایل ردگیری نسخه ۳ (Trace file format v3)
- نسخه سوم قالب فایل ردگیری در fio نسخه ۳.۳۱ اضافه شد. این نسخه اجبار میکند که هر عملیات یک برچسب زمانی (timestamp) مرتبط با خود داشته باشد.
خط نخست فایل ردگیری باید این باشد:
"fio version 3 iolog"
به دنبال آن خطوطی در دو قالب مختلف میتوانند بیایند که در زیر شرح داده شدهاند.
قالب مدیریت فایل (The file management format):
قالب عملیات I/O فایل (The file I/O action format):
مقدار `timestamp` نسبت به شروع اجرا است (یعنی از ۰ شروع میشود). مقادیر `filename`، `action`، `offset` و `length` همسان با نسخه ۲ هستند، به جز اینکه نسخه ۳ اجازه استفاده از عملیات `wait` را نمیدهد. هماستقرایی (Colocation) رویکردی متداول برای بهرهوری حداکثری از یک ماشین است. با این حال، تشخیص اینکه کدام بارهای کاری با یکدیگر سازگارند و کدام ناسازگار، وظیفهای به مراتب دشوارتر است. اگرچه fio میتواند بارهای کاری را به صورت همزمان از طریق چندین جاب (job) بازپخش کند، اما بخشی از متغیرها را به زمانبند (scheduler) واگذار میکند که این امر بازتولید نتایج را دشوارتر میسازد. ادغام کردن، روشی برای یکدست کردن ترتیب رویدادها است.
ادغام در بازپخش I/O تعبیه شده است و هنگامی انجام میشود که merge_blktrace_file مشخص شده باشد. فهرست فایلهای ارائهشده به read_iolog فرایند ادغام را طی کرده و یک فایل واحد ذخیرهشده در فایل مشخصشده را در خروجی تولید میکنند. فایل خروجی بهگونهای فرستاده میشود که گویی تنها فایل تحویلدادهشده به read_iolog بوده است. یک مثال به شکل زیر خواهد بود:
$ fio --read_iolog="<file1>:<file2>" --merge_blktrace_file="<output_file>"
تنها ایجاد فایل ادغامشده را میتوان با ارسال آرگومان خط فرمان merge-blktrace-only انجام داد.
مقیاسبندی ردها (traces) میتواند برای مشاهدهٔ اثر نسبی کاهش یا افزایش سرعت یک رد خاص انجام شود. گزینهٔ merge_blktrace_scalars فهرستی از ضرایب مقیاس درصدی جداشده با دونقطه را دریافت میکند. این مقادیر بر اساس اندیس با فایلهای فرستادهشده به read_iolog جفت میشوند.
با مقیاسبندی، ممکن است تطبیق زمان اجرای تمام ردها مطلوب باشد. این کار با merge_blktrace_iters امکانپذیر است. این گزینه نیز دقیقاً مانند merge_blktrace_scalars بر اساس اندیس با read_iolog جفت میشود.
به عنوان مثال، با فرض دو رد A و B که هر کدام ۶۰ ثانیه هستند؛ اگر بخواهیم اثر صدور درخواستهای I/O با سرعت دو برابر توسط رد A را بررسی کنیم و رد A را در طول زمان اجرای رد B تکرار نماییم، میتوان دستور زیر را انجام داد:
$ fio --read_iolog="<trace_a>:"<trace_b>" --merge_blktrace_file"<output_file>" --merge_blktrace_scalars="50:100" --merge_blktrace_iters="2:1"
این دستور رد A را با سرعت دو برابر و به تعداد ۲ بار اجرا میکند تا زمان اجرای تقریبی آن با یک بار اجرای رد B برابر شود.
پروفایلسازی بیکاری پردازنده (CPU IDLENESS PROFILING)
در برخی موارد، میخواهیم بار اضافی پردازنده (CPU overhead) را در یک آزمون بسنجیم. برای مثال، وصلهها را به طور خاص برای بررسی اینکه آیا مصرف پردازنده را کاهش میدهند یا خیر، آزمایش میکنیم. برنامهٔ fio از یک رویکرد بالونی (balloon approach) برای ایجاد یک رشته (thread) به ازای هر CPU استفاده میکند که با اولویت بیکاری (idle) اجرا میشود، به این معنی که تنها زمانی اجرا میگردد که هیچ فرآیند دیگری به CPU نیاز نداشته باشد. با اندازهگیری مقدار کار تکمیلشده توسط این رشته، میزان بیکاری هر CPU بر این اساس قابل استخراج است.
یک واحد کار به صورت دسترسی به یک صفحهٔ کامل از نویسههای بدون علامت (unsigned characters) تعریف میشود. میانگین و انحراف معیار زمان لازم برای تکمیل یک واحد کار، در بخش “unit work” گزارش میشود. گزینهها را میتوان برای گزارش جزئیات بیکاری به ازای هر CPU یا بیکاری کلی سیستم از طریق تجمیع آمارهای هر CPU انتخاب کرد.
اعتبارسنجی و تریگرها (VERIFICATION AND TRIGGERS)
هنگام انجام اعتبارسنجی دادهها، fio معمولاً به یکی از دو روش اجرا میشود. روش نخست یک جاب نوشتن عادی با فعال بودن اعتبارسنجی (verify) است. هنگامی که مرحلهٔ نوشتن به پایان رسید، fio به خواندن تغییر وضعیت داده و تمام آنچه را که نوشته است اعتبارسنجی میکند. مدل دوم اجرای صرفاً مرحلهٔ نوشتن است، و سپس بعداً اجرای همان جاب (اما با عملیات خواندن به جای نوشتن) برای تکرار الگوهای مشابه I/O و اعتبارسنجی محتویات میباشد. هر دوی این روشها به کامل شدن مرحلهٔ نوشتن وابسته هستند، چرا که در غیر این صورت fio نمیداند چه مقدار داده نوشته شده است.
با تریگرهای اعتبارسنجی، fio از تخلیهٔ وضعیت جاری نوشتن در فایلهای محلی پشتیبانی میکند. سپس یک بار کاری اعتبارسنجیِ خواندنِ بعدی میتواند این وضعیت را بارگذاری کرده و دقیقاً بداند کجا متوقف شود. این قابلیت به عنوان مثال برای آزمودن مواردی که در آنها برق یک سرور به شکلی مدیریتشده قطع میشود، کاربرد دارد.
یک تریگر اعتبارسنجی شامل دو مورد است:
۱) ذخیرهسازی وضعیت نوشتن هر جاب.
۲) اجرای یک دستور تریگر.
وضعیت نوشتن نسبتاً کمحجم است و در حدود چند صد بایت تا چند کیلوبایت میباشد. این وضعیت حاوی اطلاعاتی در مورد تعداد تکمیلهای انجامشده، آخرین X تکمیل و غیره است.
یک تریگر یا از طریق ایجاد ('touch') یک فایل مشخص در سیستم یا از طریق تنظیم یک مهلت زمانی (timeout) فراخوانی میشود. اگر fio با ‘--trigger-file=/tmp/trigger-file’ اجرا شود، به طور مداوم وجود ‘/tmp/trigger-file’ را بررسی میکند. با مشاهدهٔ این فایل، تریگر را فعال میسازد (در نتیجه وضعیت را ذخیره کرده و دستور تریگر را اجرا میکند).
برای اجراهای کلاینت/سرور، هم تریگر محلی و هم تریگر راه دور وجود دارد. اگر fio به عنوان backend سرور در حال اجرا باشد، وضعیت جابها را برای ذخیرهسازی امن به کلاینت بازمیگرداند و سپس در صورت تعیین، تریگر راه دور را اجرا میکند. اگر تریگر محلی مشخص شده باشد، سرور همچنان وضعیت نوشتن را بازمیگرداند، اما سپس کلاینت تریگر را اجرا خواهد کرد.
مثال تریگر اعتبارسنجی (Verification trigger example)
server# fio --server
و روی کلاینت، بار کاری را شروع میکنیم:
localbox$ fio --client=server --trigger-file=/tmp/my-trigger --trigger-remote="bash -c "echo b > /proc/sysrq-triger""
ما ‘/tmp/my-trigger’ را به عنوان فایل تریگر تنظیم میکنیم و به fio میگوییم دستور زیر را اجرا کند:
echo b > /proc/sysrq-trigger
روی سرور، پس از دریافت تریگر و ارسال وضعیت نوشتن به ما اجرا شود. این روش کار خواهد کرد، اما در واقع برق سرور را قطع نمیکند، بلکه تنها آن را به طور ناگهانی بازراهاندازی (reboot) میکند. اگر روشی از راه دور برای قطع برق سرور از طریق IPMI یا موارد مشابه داشته باشیم، میتوانیم به جای آن از یک دستور تریگر محلی استفاده کنیم. فرض کنید اسکریپتی به نام ipmi-reboot داریم که بازراهاندازی از طریق IPMI را برای نام میزبان مشخصی انجام میدهد. در localbox، میتوانستیم به جای آن fio را با یک تریگر محلی اجرا کنیم:
localbox$ fio --client=server --trigger-file=/tmp/my-trigger --trigger="ipmi-reboot server"
در این حالت، fio منتظر میماند تا سرور وضعیت نوشتن را ارسال کند، و با وقوع آن، ‘ipmi-reboot server’ را اجرا مینماید.
بارگذاری وضعیت اعتبارسنجی (Loading verify state)
time (msec), value, data direction, block size (bytes), offset (bytes), command priority, issue time (nsec)
مقدار «Time» برای هر مدخل لاگ همیشه بر حسب میلیثانیه است. مقدار «value» ثبتشده به نوع لاگ بستگی دارد و یکی از موارد زیر خواهد بود:
- لاگ تأخیر (Latency log)
- مقدار، میزان تأخیر بر حسب نانوثانیه (nsecs) است
- لاگ پهنای باند (Bandwidth log)
- مقدار بر حسب KiB/sec است
- لاگ IOPS
- مقدار برابر با IOPS است
«Data direction» (جهت داده) یکی از موارد زیر است:
- 0
- عملیات I/O از نوع خواندن (READ) است
- 1
- عملیات I/O از نوع نوشتن (WRITE) است
- 2
- عملیات I/O از نوع پاکسازی (TRIM) است
مقدار «block size» در هر مدخل همیشه بر حسب بایت است. «offset» موقعیت بر حسب بایت از ابتدای فایل برای آن I/O خاص است. ثبت آفست را میتوان با log_offset فعال یا غیرفعال کرد.
اگر log_prio تنظیم نشده باشد، مقدار «Command priority» مدخل برای یک I/O که با بالاترین کلاس اولویت بلادرنگ (RT) اجرا شده باشد (prioclass=1 یا cmdprio_class=1) برابر با ۱ و در غیر این صورت ۰ خواهد بود. این مقدار توسط گزینهٔ prioclass و گزینههای ویژهٔ ioengine شامل cmdprio_percentage و cmdprio_class کنترل میشود. اگر log_prio تنظیم شده باشد، مقدار «Command priority» مدخل همان اولویت تعیینشده برای I/O است، بهصورت یک عدد هگزادسیمال ۱۶ بیتی که ۱۳ بیت کمارزشتر آن نشاندهنده مقدار اولویت (گزینههای prio و cmdprio) و ۳ بیت پرارزشتر آن نشاندهنده کلاس اولویت I/O (گزینههای prioclass و cmdprio_class) هستند.
مقدار «issue time» مدخل، زمان صدور دستور بر حسب نانوثانیه است. ثبت زمان صدور را میتوان با log_issue_time تغییر وضعیت داد. این فیلد در فایل لاگ تأخیر تکمیل (clat) یا فایل لاگ تأخیر ارسال (slat) دارای مقادیر معتبر است. در سایر فایلهای لاگ، مقدار این فیلد ۰ است.
بهطور پیشفرض fio هر عملیات I/O را بهصورت مجزا ثبت میکند، اما هنگامی که ثبت بازهای/پنجرهای از طریق log_avg_msec تنظیم شود، یا میانگین (بهطور پیشفرض)، یا مقدار بیشینه («value») در طول بازهٔ زمانی مشخصشده (زمانی که log_window_value برابر با max باشد)، و یا هر دو مقدار میانگین («value») و بیشینه («value1») (زمانی که log_window_value برابر با both باشد) ثبت میگردد. ساختار فایل لاگ هنگامی که هر دو مقدار گزارش میشوند به این شکل خواهد بود:
time (msec), value, value1, data direction, block size (bytes), offset (bytes), command priority, issue time (nsec)
هر «data direction» مشاهدهشده در بازه زمانی پنجره، مقادیر خود را در یک سطر جداگانه تجمیع خواهد کرد. علاوه بر این، هنگام استفاده از ثبت پنجرهای، مدخلهای «block size»، «offset» و «issue time» همواره حاوی 0 خواهند بود.
کلاینت / سرور (CLIENT / SERVER)
بهطور معمول fio به عنوان یک برنامهٔ مستقل روی ماشینی که قرار است بار کاری I/O در آن ایجاد شود اجرا میگردد. با این حال، بخشهای backend و frontend ابزار fio میتوانند جداگانه اجرا شوند؛ یعنی سرور fio میتواند بار کاری I/O را روی «دستگاه تحت آزمایش» (Device Under Test یا DUT) ایجاد کند، در حالی که از طریق یک کلاینت در ماشینی دیگر کنترل میشود.
سرور را روی ماشینی که به فضای ذخیرهسازی DUT دسترسی دارد اجرا کنید:
$ fio --server=args
که در آن «args» مشخص میکند fio به چه چیزی گوش فرا دهد. آرگومانها به شکل «type,hostname» یا «IP,port» هستند. مقدار «type» یا «ip» (یا ip4) برای TCP/IP v4 است، یا «ip6» برای TCP/IP v6، یا «sock» برای یک سوکت محلی دامنه یونیکس (unix domain socket). مقدار «hostname» میتواند نام میزبان یا آدرس IP باشد، و «port» درگاهی است که باید به آن گوش داده شود (فقط برای TCP/IP معتبر است، نه سوکت محلی). چند مثال:
- 1) fio --server
- راهاندازی سرور fio و گوش دادن روی تمام رابطها در درگاه پیشفرض (8765).
- 2) fio --server=ip:hostname,4444
- راهاندازی سرور fio و گوش دادن روی IP متعلق به hostname و درگاه 4444.
- 3) fio --server=ip6:::1,4444
- راهاندازی سرور fio و گوش دادن روی لوکالهاست IPv6 یعنی ::1 و درگاه 4444.
- 4) fio --server=,4444
- راهاندازی سرور fio و گوش دادن روی تمام رابطها در درگاه 4444.
- 5) fio --server=1.2.3.4
- راهاندازی سرور fio و گوش دادن روی IP با مقدار 1.2.3.4 در درگاه پیشفرض.
- 6) fio --server=sock:/tmp/fio.sock
- راهاندازی سرور fio و گوش دادن روی سوکت محلی /tmp/fio.sock.
هنگامی که سرور در حال اجراست، یک «کلاینت» میتواند با دستور زیر به سرور fio متصل شود:
$ fio <local-args> --client=<server> <remote-args> <job file(s)>
که در آن «local-args» آرگومانهای کلاینت در محل اجرای آن هستند، «server» رشتهٔ اتصال است، و «remote-args» و «job file(s)» به سرور ارسال میشوند. رشتهٔ «server» از همان ساختار سمت سرور پیروی میکند تا امکان تعیین IP، نام میزبان، سوکت و درگاه وجود داشته باشد.
توجه داشته باشید که هنگام اجرای fio به عنوان کلاینت، تمام گزینههای کار باید در فایلهای کار تعریف شوند. هرگونه گزینهٔ کاری که در «remote-args» مشخص شود نادیده گرفته خواهد شد.
دستور fio میتواند به این روش به چندین سرور متصل شود:
$ fio --client=<server1> <job file(s)> --client=<server2> <job file(s)>
اگر فایل کار روی سرور fio قرار داشته باشد، میتوانید به سرور بگویید که فایل محلی را نیز بارگذاری کند. این کار با استفاده از --remote-config انجام میشود:
$ fio --client=server --remote-config /path/to/file.fio
در این صورت fio این فایل کار محلی (روی سرور) را باز میکند، به جای اینکه فایلی از کلاینت به آن ارسال شود.
اگر سرورهای متعددی دارید (برای مثال: ۱۰۰ ماشین مجازی/کانتینر)، میتوانید مسیر فایلی حاوی IPها یا نامهای میزبان را به عنوان مقدار پارامتر گزینهٔ --client وارد کنید. برای نمونه، در اینجا یک فایل فرضی «host.list» حاوی ۲ نام میزبان آورده شده است:
host1.your.dns.domain
host2.your.dns.domain
سپس دستور fio به این صورت خواهد بود:
$ fio --client=host.list <job file(s)>
در این حالت نمیتوانید پارامترها یا فایلهای کار مخصوص به هر سرور را وارد کنید -- تمامی سرورها فایل کار یکسانی را دریافت میکنند.
به منظور فراهم کردن امکان استفاده از یک سیستم فایل مشترک از سوی چندین میزبان برای اجراهای «fio --client»، این دستور اکنون آدرس IP سرور را به ابتدای نام فایل اضافه میکند. برای مثال، اگر fio از پوشهٔ «/mnt/nfs/fio» استفاده کند و در حال نوشتن روی نام فایل «fileio.tmp» باشد، همراه با یک «hostfile» در --client شامل دو نام میزبان «h1» و «h2» با آدرسهای IP به شمارههای 192.168.10.120 و 192.168.10.121، آنگاه fio دو فایل زیر را ایجاد خواهد کرد:
/mnt/nfs/fio/192.168.10.120.fileio.tmp
/mnt/nfs/fio/192.168.10.121.fileio.tmp
این رفتار را میتوان با استفاده از گزینهٔ unique_filename غیرفعال کرد.
خروجی موجز (terse) در حالت کلاینت/سرور با خروجی تولیدشده در حالت اجرای مستقل fio کمی تفاوت خواهد داشت. برای اطلاعات بیشتر، بخش خروجی موجز را ببینید.
همچنین،
اگر با یک
بار
فراخوانی fio،
بارهای
کاری روی
چندین سرور
اجرا شوند،
fio در انتها
یک گزارش
خلاصهٔ
تجمیعی
برای همه
بارهای
کاری ارائه
خواهد داد.
این گزارش
خلاصهٔ
تجمیعی فرض
را بر این
میگذارد
که
گزینههای
موثر بر
گزارشدهی
مانند unified_rw_reporting
و percentile_list در
تمام
کارهای
خلاصه شده
یکسان
هستند.
داشتن
مقادیر
متفاوت
برای این
گزینهها
یک
پیکربندی
پشتیبانینشده
است..SH
"نویسندگان
(AUTHORS)" fio توسط Jens Axboe
<axboe@kernel.dk> نوشته
شده است.
این صفحهٔ
راهنما
توسط Aaron Carroll
<aaronc@cse.unsw.edu.au> بر
اساس
مستندات Jens Axboe
نوشته شده
است.
این صفحهٔ
راهنما
توسط Tomohiro Kusumi <tkusumi@tuxera.com>
بر اساس
مستندات Jens Axboe
بازنویسی
شده است.
گزارش باگها (REPORTING BUGS)
باگها را
به فهرست
پستی fio به
نشانی <fio@vger.kernel.org>
گزارش دهید.
REPORTING-BUGS را
ببینید.
REPORTING-BUGS: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/fio.git/tree/REPORTING-BUGS
همچنین ببینید (SEE ALSO)
برای
مستندات
بیشتر، HOWTO و
README را
ببینید.
فایلهای
نمونهٔ jobfile در
دایرکتوری
`examples/' در دسترس
هستند.
این
فایلها
معمولاً در
مسیر `/usr/share/doc/fio'
قرار
دارند.
HOWTO:
https://git.kernel.org/pub/scm/linux/kernel/git/axboe/fio.git/tree/HOWTO
README:
https://git.kernel.org/pub/scm/linux/kernel/git/axboe/fio.git/tree/README.rst
| May 2025 | User Manual |