SG_READ(8) SG3_UTILS SG_READ(8)

sg_read - خواندن چند بلوک داده، با امکان استفاده از دستورات SCSI READ

sg_read [blk_sgio=0|1] [bpt=BPT] [bs=BS] [cdbsz=6|10|12|16] count=COUNT [dio=0|1] [dpo=0|1] [fua=0|1] if=IFILE [mmap=0|1] [no_dxfer=0|1] [odir=0|1] [skip=SKIP] [time=TI] [verbose=VERB] [--help] [--version]

خواندن داده‌ها از یک دستگاه همه‌منظوره SCSI (sg) لینوکس، یک دستگاه بلوکی یا یک فایل معمولی که در آن هر دستور خواندن به یک آفست یا آدرس بلوک منطقی (lba) یکسان ارسال می‌شود. این ابزار می‌تواند برای آزمایش (یا زمان‌سنجی) حافظه نهان دیسک (کَش)، توان عملیاتی انتقال SCSI (یا سایر پروتکل‌ها)، و/یا بار پردازشی دستورات SCSI به کار رود.

هنگامی که مقدار COUNT مثبت است، در هر مرحله حداکثر تا BPT بلوک خوانده می‌شود تا زمانی که شمارش COUNT به پایان برسد. هر عملیات خواندن از همان lba آغاز می‌شود که در صورت تعیین نشدن SKIP، ابتدای فایل یا دستگاه خواهد بود.

مقدار COUNT ممکن است منفی باشد، به شرطی که IFILE یک دستگاه sg باشد یا یک دستگاه بلوکی با مقدار 'blk_sgio=1' تنظیم شده باشد. به عنوان روش جایگزین می‌توان 'bpt=0' را مشخص کرد. در این حالت‌ها، به تعداد |COUNT| دستور SCSI READ از نوع "صفر بلوک" ارسال می‌شود. "صفر بلوک" در دستورات ۱۰، ۱۲ و ۱۶ بایتی SCSI READ به معنای "هیچ کاری انجام نده" است (اما برای نوع ۶ بایتی این‌گونه نیست). در عمل، دستورات "صفر بلوک" SCSI READ تاخیر بسیار پایینی دارند و از این رو روشی مناسب برای سنجش بار پردازشی دستورات SCSI محسوب می‌شوند.

لطفاً توجه داشته باشید: این یک ابزار بسیار قدیمی است که برای LBA دیسک و شمارنده از اعداد صحیح ۳۲ بیتی استفاده می‌کند. بنابراین نمی‌تواند در دیسک‌هایی با بلوک‌های منطقی ۵۱۲ بایتی، به فضایی فراتر از ۲ ترابایت آدرس‌دهی کند. ابزارهای جایگزین مناسب sg_dd و ddpt هستند.

رفتار پیش‌فرض این ابزار استفاده از دستور یونیکسی ()read است، هنگامی که IFILE یک دستگاه بلوکی باشد. در هسته لینوکس 2.6 به بعد بسیاری از دستگاه‌های بلوکی می‌توانند دستورات SCSI ارسالی از طریق ioctl مربوط به SG_IO را مدیریت کنند. بنابراین زمانی که این گزینه تنظیم شود، ioctl مربوط به SG_IO دستورات SCSI READ را در صورت بلوکی بودن IFILE به آن ارسال می‌کند.
که در آن BPT حداکثر تعداد بلوک‌هایی است که در هر عملیات خواندن واکشی می‌شود. هنگامی که مقدار باقی‌مانده COUNT کمتر از BPT باشد، بلوک‌های کمتری واکشی خواهند شد. مقدار پیش‌فرض BPT برابر 128 است. توجه داشته باشید که هر عملیات خواندن از یک lba ثابت آغاز می‌شود (مشخص‌شده توسط skip=SKIP یا 0). اگر 'bpt=0' باشد، آن‌گاه COUNT به عنوان تعداد دستورات SCSI READ صفر بلوکی برای ارسال تفسیر می‌شود.
که در آن BS اندازه (به بایت) هر بلوک خوانده‌شده است. در صورتی که دستورات SCSI به IFILE ارسال شوند، این مقدار باید دقیقاً برابر با اندازه بلوک دستگاه فیزیکی باشد (پیش‌فرض 512 است).
اندازه دستورات SCSI READ ارسال‌شده روی نام‌های دستگاه sg، یا دستگاه‌های بلوکی در صورت تعیین 'blk_sgio=1'. مقدار پیش‌فرض دستورات ۱۰ بایتی SCSI READ است.
هنگامی که COUNT یک عدد مثبت باشد، آن تعداد بلوک خوانده می‌شود که معمولاً با چندین عملیات خواندن همراه است. هنگامی که COUNT منفی باشد، به تعداد |COUNT| دستور SCSI READ با درخواست انتقال صفر بلوک اجرا می‌شود. تعیین این گزینه اجباری است.
پیش‌فرض 0 است که ورودی/خروجی غیرمستقیم را انتخاب می‌کند. مقدار 1 برای ورودی/خروجی مستقیم تلاش می‌کند که اگر در دسترس نباشد، به ورودی/خروجی غیرمستقیم بازگشته و در پایان این موضوع را گزارش می‌دهد. این گزینه تنها زمانی فعال است که IFILE یک دستگاه sg باشد. اگر ورودی/خروجی مستقیم انتخاب شده باشد و فایل /sys/module/sg/parameters/allow_dio حاوی مقدار 0 باشد، یک هشدار صادر شده و ورودی/خروجی غیرمستقیم انجام می‌پذیرد.
در صورت فعال بودن، بیت غیرفعال‌سازی واکشی صفحه (DPO) در دستورات SCSI READ فعال می‌شود. در غیر این صورت بیت DPO پاک خواهد بود (پیش‌فرض).
در صورت تنظیم، بیت دسترسی اجباری به واحد (FUA) در دستورات SCSI READ فعال می‌شود. در غیر این صورت بیت FUA پاک خواهد بود (پیش‌فرض).
خواندن از این فایل یا دستگاه ورودی IFILE. این آرگومان باید حتماً داده شود. اگر IFILE یک فایل معمولی باشد، باید قابلیت جستجو (seekable) داشته باشد (اگر (COUNT > BPT) یا skip=SKIP داده شده باشد). از این رو ورودی استاندارد (stdin) پذیرفته نیست (و دادن "-" به عنوان آرگومان IFILE به عنوان خطا گزارش می‌شود).
پیش‌فرض 0 است که ورودی/خروجی غیرمستقیم را انتخاب می‌کند. مقدار 1 باعث انجام ورودی/خروجی نگاشت‌شده در حافظه (memory mapped IO) می‌شود. انتخاب هم‌زمان dio و mmap خطا محسوب می‌شود. این گزینه تنها در صورتی فعال است که IFILE یک دستگاه sg باشد.
در صورت فعال بودن، انتقال‌های DMA از دستگاه به بافرهای هسته انجام می‌شود اما فراتر از آن نمی‌رود (یعنی کپی دوم به فضای کاربری انجام نخواهد شد). مقدار پیش‌فرض 0 است که در این حالت انتقال داده‌ها به فضای کاربری صورت می‌گیرد. هنگامی که هیچ‌کدام از گزینه‌های mmap و dio تنظیم نشده باشند، انتقال داده‌ها از طریق بافرهای هسته کپی می‌شود (یعنی کپی دو مرحله‌ای). این گزینه عمدتاً برای مقاصد آزمایشی است.
در صورت فعال بودن، فایل ورودی IFILE که یک دستگاه بلوکی است با فلگ اضافی O_DIRECT باز می‌شود. مقدار پیش‌فرض 0 است (عدم باز کردن دستگاه‌های بلوکی با O_DIRECT).
تمامی عملیات خواندن با انحراف و جابه‌جایی به اندازه SKIP بلوک (با اندازه bs) از ابتدای فایل ورودی (یا دستگاه) آغاز خواهد شد.
هنگامی که TI برابر 0 باشد (پیش‌فرض) زمان‌سنجی انجام نمی‌شود. هنگامی که 1 باشد، مدت زمان انتقال را اندازه گرفته و محاسبه توان عملیاتی را از اولین دستور ارسال‌شده تا اتمام کار انجام می‌دهد. هنگامی که 2 باشد، زمان‌سنجی و محاسبه توان را از دومین دستور ارسالی تا پایان انجام می‌دهد. در صورت مقدار 3 از دستور سوم زمان می‌گیرد و الی آخر. میانگین تعداد دستورات اجراشده (دستورات SCSI READ یا فراخوانی‌های یونیکسی ()read) در ثانیه نیز در خروجی نمایش داده می‌شود.
با افزایش مقدار VERB، میزان خروجی‌های اشکال‌زدایی ارسالی به stderr افزایش می‌یابد. مقدار پیش‌فرض صفر است که حداقل خروجی اشکال‌زدایی را به همراه دارد. مقدار 1 اطلاعات اضافی غیرتکراری را گزارش می‌کند.
چاپ پیام راهنمای نحوه استفاده و سپس خروج.
نمایش اطلاعات نسخه و سپس خروج.

آرگومان‌های عددی گوناگون (مانند SKIP) ممکن است شامل پسوندهای ضریب باشند یا در قالب هگزادسیمال وارد شوند. بخش "NUMERIC ARGUMENTS" را در صفحه راهنمای sg3_utils(8) مشاهده کنید.

داده‌ها معمولاً در یک فرایند ۲ مرحله‌ای به فضای کاربری می‌رسند: ابتدا آداپتور SCSI عمل DMA را به درون بافرهای هسته انجام می‌دهد و سپس درایور sg این داده‌ها را به حافظه کاربر کپی می‌کند. به این فرایند "ورودی/خروجی غیرمستقیم" (indirect IO) می‌گویند و گزینه "dio" برای انتخاب "ورودی/خروجی مستقیم" (direct IO) وجود دارد که مستقیماً عمل DMA را به درون حافظه کاربر انجام خواهد داد. به دلیل برخی مسائل، "ورودی/خروجی مستقیم" در درایور sg غیرفعال است و برای فعال‌سازی نیاز به تغییر در پیکربندی دارد. این کار معمولاً با دستور "echo 1 > /sys/module/sg/parameters/allow_dio" صورت می‌گیرد. روش جایگزین دیگر برای جلوگیری از کپی ۲ مرحله‌ای، استفاده از ورودی/خروجی نگاشت‌شده در حافظه با 'mmap=1' است.

مدیریت سیگنال‌ها از ابزار dd الگوبرداری شده است: سیگنال‌های SIGINT، SIGQUIT و SIGPIPE تعداد بلوک‌های باقی‌مانده برای انتقال را چاپ می‌کنند و سپس اقدام پیش‌فرض خود را انجام می‌دهند. سیگنال SIGUSR1 سبب چاپ همان اطلاعات می‌شود اما فرآیند کپی ادامه می‌یابد. تمام خروجی‌های ناشی از سیگنال‌ها به stderr فرستاده می‌شوند.

فرض کنیم /dev/sg0 یک دیسک است و قصد داریم کارایی حافظه نهان (کَش) دیسک را زمان‌سنجی کنیم:

sg_read if=/dev/sg0 bs=512 count=1MB mmap=1 time=2

این دستور به طور مداوم ۱۲۸ بلوک ۵۱۲ بایتی را از بلوک شماره ۰ می‌خواند. مقدار "128" مقدار پیش‌فرض برای 'bpt' است در حالی که "بلوک 0" به دلیل تعیین نشدن آرگومان 'skip' انتخاب شده است. این عملیات تا خوانده شدن ۱,۰۰۰,۰۰۰ بلوک ادامه خواهد داشت. منطق پشت استفاده از 'time=2' این است که اولین عملیات خواندن ۶۴ کیلوبایتی با رسانه مغناطیسی دیسک درگیر می‌شود در حالی که سایر عملیات خواندن به حافظه نهان دیسک اصابت کرده و از آن خوانده می‌شوند. خروجی شبیه به این خواهد بود:

time from second command to end was 4.50 secs, 113.70 MB/sec
Average number of READ commands per second was 1735.27
1000000+0 records in, SCSI commands issued: 7813

وضعیت خروج sg_read در صورت موفقیت 0 است. در غیر این صورت صفحه راهنمای sg3_utils(8) را مشاهده کنید.

نوشته‌شده توسط Douglas Gilbert.

گزارش اشکالات به <dgilbert at interlog dot com>.

حق نشر © 2000-2019 Douglas Gilbert
این نرم‌افزار تحت مجوز GPL نسخه ۲ توزیع شده است. هیچ تضمینی وجود ندارد؛ حتی برای قابلیت فروش یا تناسب با یک هدف خاص.

برای زمان‌سنجی خواندن یا نوشتن رسانه‌های جریانی، به sg_dd در بسته sg3_utils و ddpt در بسته‌ای به همین نام مراجعه کنید. بسته lmbench شامل ابزار lmdd است که آن نیز قابل توجه است. raw(8), dd(1)

September 2019 sg3_utils-1.45