.\" -*- mode: troff; coding: utf-8 -*- .\" Automatically generated by Podwrapper::Man 1.60.1 (Pod::Simple 3.45) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie n \{\ . ds C` "" . ds C' "" 'br\} .el\{\ . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Required to disable full justification in groff 1.23.0. .if n .ds AD l .\" ======================================================================== .\" .IX Title "guestfs-performance 1" .TH guestfs-performance 1 2026-07-14 libguestfs-1.60.1 "Virtualization Support" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "نام (NAME)" guestfs\-performance \- مهندسی و بهینه‌سازی libguestfs برای دستیابی به بالاترین کارایی .SH "توضیحات (DESCRIPTION)" .IX Header "DESCRIPTION" این صفحه نحوه دستیابی به بیشترین کارایی را از .BR libguestfs ، به‌ویژه زمانی که قصد دارید از .B libguestfs برای کار با هزاران ماشین مجازی یا ایمیج دیسک استفاده کنید، مستند می‌کند. .PP سه زمینه اصلی پوشش داده شده است. .B Libguestfs یک اپلاینس (یک توزیع کوچک لینوکس) را درون .B qemu/KVM اجرا می‌کند. دو بخش نخست عبارتند از: به حداقل رساندن زمان لازم برای راه‌اندازی این اپلاینس، و تعداد دفعاتی که اپلاینس باید راه‌اندازی شود. بخش سوم، کوتاه‌تر کردن زمان لازم برای بازرسی (inspection) ماشین‌های مجازی است. .SH "اندازه‌گیری‌های پایه (BASELINE MEASUREMENTS)" .IX Header "BASELINE MEASUREMENTS" پیش از اعمال تغییرات در نحوه استفاده از .BR libguestfs ، اندازه‌گیری‌های پایه را انجام دهید. .SS "پایه: راه‌اندازی اپلاینس (Baseline: Starting the appliance)" .IX Subsection "Baseline: Starting the appliance" روی یک ماشین بدون بار، مدت‌زمان لازم برای راه‌اندازی اپلاینس را اندازه‌گیری کنید: .PP .Vb 1 \& time guestfish \-a /dev/null run .Ve .PP این دستور را چندین بار متوالی اجرا کرده و چند اجرای اول را نادیده بگیرید تا یک وضعیت معمولی «کش گرم» (hot cache) را اندازه‌گیری نمایید. .PP \&\fIنکته جانبی برای توسعه‌دهندگان:\fR برنامه‌ای به نام \&\fIboot\-benchmark\fR در https://github.com/libguestfs/libguestfs\-analysis\-tools وجود دارد که همین کار را انجام می‌دهد، اما چندین اجرا انجام داده و میانگین و انحراف معیار را چاپ می‌کند. .PP \fIتوضیحات\fR .IX Subsection "Explanation" .PP دستور .B guestfish بالا، اپلاینس .B libguestfs را روی یک دیسک خالی (null) راه‌اندازی کرده و بلافاصله آن را خاموش می‌کند. نخستین باری که این دستور را اجرا می‌کنید، یک اپلاینس ایجاد کرده و آن را کش می‌کند (معمولاً در مسیر \&\fI/var/tmp/.guestfs\-*\fR). اجراهای بعدی باید از اپلاینس کش‌شده مجدداً استفاده کنند. .PP \fIنتایج مورد انتظار\fR .IX Subsection "Expected results" .PP باید انتظار زمان‌های زیر ۶ ثانیه را داشته باشید. اگر زمان‌هایی که در یک ماشین بدون بار مشاهده می‌کنید بیشتر از این مقدار است، به بخش «عیب‌یابی کارایی ضعیف» در ادامه مراجعه کنید. .SS "پایه: انجام بازرسی یک مهمان (Baseline: Performing inspection of a guest)" .IX Subsection "Baseline: Performing inspection of a guest" برای این آزمایش، به یک ماشین بدون بار و دست‌کم یک سیستم مهمان واقعی یا ایمیج دیسک نیاز خواهید داشت. اگر قصد دارید از .B libguestfs تنها برای مهمان‌های X استفاده کنید (مثلاً X = ویندوز)، استفاده از یک مهمان X در اینجا مناسب‌ترین گزینه خواهد بود. اگر قصد دارید .B libguestfs را روی ترکیبی از مهمان‌ها اجرا کنید، برای آزمایش در اینجا از ترکیبی از مهمان‌ها استفاده نمایید. .PP مدت‌زمان لازم برای انجام بازرسی و سوار کردن دیسک‌های مهمان را اندازه بگیرید. اگر از ایمیج‌های دیسک استفاده می‌کنید از دستور نخست، و اگر از .B libvirt استفاده می‌کنید از دستور دوم بهره بگیرید: .PP .Vb 1 \& time guestfish \-\-ro \-a disk.img \-i exit \& \& time guestfish \-\-ro \-d GuestName \-i exit .Ve .PP این دستور را چندین بار متوالی اجرا کرده و چند اجرای اول را نادیده بگیرید تا یک وضعیت معمولی «کش گرم» را اندازه‌گیری کنید. .PP \fIتوضیحات\fR .IX Subsection "Explanation" .PP این دستور، اپلاینس .B libguestfs را روی ایمیج دیسک یا مهمان .B libvirt مشخص‌شده راه‌اندازی می‌کند، بازرسی .B libguestfs را روی آن انجام می‌دهد (بخش "INSPECTION" در \fBguestfs\fR\|(3) را ببینید)، دیسک‌های مهمان را سوار می‌کند، سپس تمام این نتایج را دور ریخته و خاموش می‌شود. .PP نخستین باری که این دستور را اجرا می‌کنید، یک اپلاینس ساخته و آن را کش خواهد کرد (معمولاً در مسیر \fI/var/tmp/.guestfs\-*\fR). اجراهای بعدی باید مجدداً از اپلاینس کش‌شده استفاده کنند. .PP \fIنتایج مورد انتظار\fR .IX Subsection "Expected results" .PP باید انتظار زمان‌هایی را داشته باشید که حداکثر ۵ ثانیه بیشتر از مقدار اندازه‌گیری‌شده در نخستین آزمون پایه بالا باشند. (برای مثال، اگر اولین آزمون پایه در ۵ ثانیه اجرا شد، این آزمون باید در زمان ≤ ۱۰ ثانیه اجرا شود). .SH "درک اپلاینس و زمان ساخت یا کش شدن آن (UNDERSTANDING THE APPLIANCE AND WHEN IT IS BUILT/CACHED)" .IX Header "UNDERSTANDING THE APPLIANCE AND WHEN IT IS BUILT/CACHED" نخستین باری که از .B libguestfs استفاده می‌کنید، یک اپلاینس را ساخته و کش می‌کند. این معمولاً در مسیر \fI/var/tmp/.guestfs\-*\fR است، مگر اینکه \f(CW$TMPDIR\fR یا \f(CW$LIBGUESTFS_CACHEDIR\fR را تنظیم کرده باشید که در این صورت زیر آن دایرکتوری موقت قرار خواهد گرفت. .PP برای اطلاعات بیشتر درباره نحوه ساخت اپلاینس، بخش "SUPERMIN APPLIANCES" در \fBsupermin\fR\|(1) را ببینید. .PP هر بار که .B libguestfs اجرا می‌شود، بررسی می‌کند که هیچ‌یک از فایل‌های میزبان مورد استفاده اپلاینس تغییر نکرده باشند. اگر تغییری رخ داده باشد، اپلاینس مجدداً ساخته می‌شود. این حالت معمولاً زمانی رخ می‌دهد که یک بسته روی میزبان نصب یا به‌روزرسانی شود (مثلاً با استفاده از برنامه‌هایی مانند \f(CW\*(C`yum\*(C'\fR یا \f(CW\*(C`apt\-get\*(C'\fR). دلیل بازسازی اپلاینس، امنیت است: برنامه جدیدی که نصب شده ممکن است حاوی یک وصله امنیتی باشد، بنابراین می‌خواهیم برنامه اصلاح‌شده به‌صورت خودکار در اپلاینس گنجانده شود. .PP پیامدهای این موضوع بر کارایی به شرح زیر است: .IP \(bu 4 فرآیند ساخت (یا بازسازی) اپلاینس کش‌شده کند است، و می‌توانید با استفاده از یک اپلاینس ثابت از وقوع آن جلوگیری کنید (در ادامه ببینید). .IP \(bu 4 در صورت عدم استفاده از یک اپلاینس ثابت، آگاه باشید که به‌روزرسانی نرم‌افزار روی میزبان موجب یک‌بار بازسازی اپلاینس خواهد شد. .IP \(bu 4 دایرکتوری \&\fI/var/tmp\fR (یا \f(CW$TMPDIR\fR و \f(CW$LIBGUESTFS_CACHEDIR\fR) باید روی یک دیسک سریع قرار داشته باشد و فضای کافی برای اپلاینس داشته باشد. .SH "استفاده از یک اپلاینس ثابت (USING A FIXED APPLIANCE)" .IX Header "USING A FIXED APPLIANCE" برای کنترل کامل بر زمان ساخت اپلاینس، می‌توانید یک اپلاینس ثابت بسازید. این اپلاینس باید روی یک دیسک محلی سریع ذخیره شود. .PP برای ساخت اپلاینس، دستور زیر را اجرا کنید: .PP .Vb 1 \& libguestfs\-make\-fixed\-appliance .Ve .PP که در آن \f(CW\*(C`\*(C'\fR با نام دایرکتوری محل ذخیره اپلاینس جایگزین می‌شود (معمولاً یک زیردایرکتوری را مشخص می‌کنید، برای مثال: \fI/usr/local/lib/guestfs/appliance\fR یا \&\fI/dev/shm/appliance\fR). .PP سپس \f(CW$LIBGUESTFS_PATH\fR را مقداردهی کنید (و مطمئن شوید این متغیر محیطی در برنامه .B libguestfs شما تنظیم شده است)، یا برنامه خود را به‌گونه‌ای تغییر دهید که \&\f(CW\*(C`guestfs_set_path\*(C'\fR را فراخوانی کند. برای مثال: .PP .Vb 1 \& export LIBGUESTFS_PATH=/usr/local/lib/guestfs/appliance .Ve .PP اکنون می‌توانید برنامه‌های .BR libguestfs ، ابزارهای .BR virt ، .B guestfish و غیره را طبق روال معمول اجرا کنید. این برنامه‌ها از اپلاینس ثابت شما استفاده خواهند کرد و هرگز اپلاینس اختصاصی خود را نمی‌سازند، بازسازی نمی‌کنند یا کش نخواهند کرد. .PP (برای اطلاعات دقیق در این زمینه، ببینید: \&\fBlibguestfs\-make\-fixed\-appliance\fR\|(1)). .SS "کارایی اپلاینس ثابت (Performance of the fixed appliance)" .IX Subsection "Performance of the fixed appliance" در آزمایش‌های ما مشخص نشد که استفاده از یک اپلاینس ثابت برتری کارایی قابل‌اندازه‌گیری به همراه داشته باشد، حتی زمانی که اپلاینس در حافظه (یعنی روی \fI/dev/shm\fR) قرار داشت. با این حال دو نکته شایان توجه وجود دارد: .IP 1. 4 استفاده از یک اپلاینس ثابت مانع از آن می‌شود که .B libguestfs اپلاینس را بازسازی کند؛ به این معنی که .B libguestfs زمان‌های راه‌اندازی قابل‌پیش‌بینی‌تری خواهد داشت. .IP 2. 4 اپلاینس در صورت نیاز (on demand) بارگذاری می‌شود. یک آزمایش ساده مانند: .Sp .Vb 1 \& time guestfish \-a /dev/null run .Ve .Sp بخش زیادی از اپلاینس را بارگذاری نمی‌کند. یک برنامه واقعی .B libguestfs با استفاده از فراخوانی‌های پیچیده API، بخش بسیار بیشتری از اپلاینس را بر حسب تقاضا بارگذاری خواهد کرد. قابلیت ذخیره اپلاینس در یک مکان مشخص، کارایی را قابل‌پیش‌بینی‌تر می‌سازد. .SH "کاهش تعداد دفعات راه‌اندازی اپلاینس (REDUCING THE NUMBER OF TIMES THE APPLIANCE IS LAUNCHED)" .IX Header "REDUCING THE NUMBER OF TIMES THE APPLIANCE IS LAUNCHED" موثرترین روش، هرچند نه همیشه ساده‌ترین، برای دستیابی به کارایی بالا این است که اطمینان حاصل کنید اپلاینس حداقل دفعات ممکن راه‌اندازی می‌شود. این کار احتمالاً مستلزم تغییر برنامه .B libguestfs شما خواهد بود. .PP سعی کنید \f(CW\*(C`guestfs_launch\*(C'\fR را حداکثر یک بار به ازای هر ماشین مجازی یا ایمیج دیسک هدف فراخوانی کنید. .PP به‌جای استفاده از نمونه‌های مجزای \fBguestfish\fR\|(1) برای اعمال مجموعه‌ای از تغییرات روی یک مهمان، از یک نمونه واحد .B guestfish استفاده کنید و/یا گزینه \fI\-\-listen\fR دستور .B guestfish را به کار بگیرید. .PP نوشتن برنامه خود به صورت یک دیمن (daemon) را در نظر بگیرید که حین انجام مجموعه‌ای از تغییرات، مهمان را باز نگه می‌دارد. یا تمامی عملیاتی را که می‌خواهید انجام دهید پیش از باز کردن مهمان آماده‌سازی و مرتب (marshal) کنید. .PP همچنین می‌توانید افزودن دیسک‌های چندین مهمان به یک اپلاینس واحد را امتحان کنید. پیش از امتحان این روش، به نکات زیر توجه داشته باشید: .IP 1. 4 افزودن چندین مهمان به یک اپلاینس یک مشکل امنیتی است، زیرا ممکن است به یک مهمان اجازه دهد در دیسک‌های مهمان دیگر مداخله کند. این کار را تنها زمانی انجام دهید که به همه مهمان‌ها اعتماد دارید، یا می‌توانید مهمان‌ها را بر اساس سطح اعتماد گروه‌بندی کنید. .IP 2. 4 یک محدودیت سخت‌افزاری/سیستمی (hard limit) برای تعداد دیسک‌هایی که می‌توانید به یک اپلاینس واحد اضافه کنید وجود دارد. برای به دست آوردن این حد، "guestfs_max_disks" در \fBguestfs\fR\|(3) را فراخوانی کنید. برای اطلاعات بیشتر، بخش "LIMITS" در \fBguestfs\fR\|(3) را ببینید. .IP 3. 4 استفاده از .B libguestfs به این شیوه پیچیده است. دیسک‌ها ممکن است تداخل‌های غیرمنتظره‌ای داشته باشند: برای نمونه، اگر دو مهمان از یک UUID یکسان برای یک سیستم‌فایل استفاده کنند (به این دلیل که کلون/شبیه‌سازی شده‌اند)، یا گروه‌های حجمی (volume groups) با نام یکسان داشته باشند (اما \f(CW\*(C`guestfs_lvm_set_filter\*(C'\fR را ببینید). .PP دستور \&\fBvirt\-df\fR\|(1) به‌طور پیش‌فرض چندین دیسک را اضافه می‌کند، بنابراین کد منبع این برنامه می‌تواند نقطه شروع مناسبی باشد. .SH "کوتاه کردن زمان لازم برای بازرسی ماشین‌های مجازی (SHORTENING THE TIME TAKEN FOR INSPECTION OF VMs)" .IX Header "SHORTENING THE TIME TAKEN FOR INSPECTION OF VMs" توصیه اصلی کاملاً روشن است: بازرسی (که عملیاتی سنگین است) را انجام ندهید مگر آنکه واقعاً به نتایج آن نیاز داشته باشید. .PP اگر قبلاً بازرسی را روی مهمان انجام داده‌اید، ممکن است کش کردن و استفاده مجدد از نتایج دفعه قبل بی‌خطر باشد. .PP برخی دیسک‌ها اصلاً نیازی به بازرسی ندارند: برای نمونه، اگر در حال ساخت یک ایمیج دیسک هستید، یا اگر ایمیج دیسک یک ماشین مجازی نیست، یا اگر ایمیج دیسک ساختار مشخص و شناخته‌شده‌ای دارد. .PP حتی زمانی که بازرسی اولیه (\f(CW\*(C`guestfs_inspect_os\*(C'\fR) لازم است، می‌توان از عملیات بازرسی کمکی اجتناب کرد: .IP \(bu 4 سوار کردن دیسک‌ها تنها برای دریافت اطلاعات بیشتر درباره سیستم‌فایل ضروری است. .IP \(bu 4 فهرست کردن برنامه‌ها (\f(CW\*(C`guestfs_inspect_list_applications\*(C'\fR) در لینوکس عملیاتی سنگین است، اما در ویندوز تقریباً بدون هزینه است. .IP \(bu 4 تولید آیکون مهمان (\f(CW\*(C`guestfs_inspect_get_icon\*(C'\fR) در لینوکس سبک است اما در ویندوز عملیاتی سنگین به شمار می‌آید. .SH "اپلاینس‌های موازی (PARALLEL APPLIANCES)" .IX Header "PARALLEL APPLIANCES" اپلاینس‌های .B Libguestfs بیشتر محدود به ورودی/خروجی (I/O bound) هستند و می‌توانید چندین اپلاینس را به‌صورت موازی راه‌اندازی کنید. به شرط وجود حافظه آزاد کافی، تفاوت ناچیزی میان راه‌اندازی ۱ اپلاینس در برابر N اپلاینس به‌صورت موازی وجود خواهد داشت. .PP روی یک لپ‌تاپ ۲ هسته‌ای (۴ رشته‌ای) با ۱۶ گیگابایت رم، با استفاده از اسکریپت آزمایشی پرل زیر (که البته چندان واقع‌گرایانه نیست)، نمودار زیر مقیاس‌پذیری عالی را هنگام اجرای موازی بین ۱ تا ۲۰ اپلاینس نشان می‌دهد: .PP .Vb 10 \& 12 ++---+----+----+----+-----+----+----+----+----+---++ \& + + + + + + + + + + * \& | | \& | * | \& 11 ++ ++ \& | | \& | | \& | * * | \& 10 ++ ++ \& | * | \& | | \& s | | \& 9 ++ ++ \& e | | \& | * | \& c | | \& 8 ++ * ++ \& o | * | \& | | \& n 7 ++ ++ \& | * | \& d | * | \& | | \& s 6 ++ ++ \& | * * | \& | * | \& | | \& 5 ++ ++ \& | | \& | * | \& | * * | \& 4 ++ ++ \& | | \& | | \& + * * * + + + + + + + + \& 3 ++-*--+----+----+----+-----+----+----+----+----+---++ \& 0 2 4 6 8 10 12 14 16 18 20 \& number of parallel appliances .Ve .PP امکان اجرای بسیار بیشتر از ۲۰ اپلاینس به‌صورت موازی وجود دارد، اما اگر از بک‌اند .B libvirt استفاده می‌کنید، باید توجه داشته باشید که .B libvirt به‌طور پیش‌فرض تعداد اتصال‌های کلاینت را به ۲۰ محدود می‌کند. .PP اسکریپت ساده پرل زیر برای جمع‌آوری داده‌های نمودار بالا به کار رفته است، اما اطلاعات بسیار بیشتری در این زمینه، از جمله اسکریپت‌های آزمایشی پیشرفته‌تر و نمودارها، در پست‌های وبلاگ زیر در دسترس است: .PP http://rwmj.wordpress.com/2013/02/25/multiple\-libguestfs\-appliances\-in\-parallel\-part\-1 .PP http://rwmj.wordpress.com/2013/02/25/multiple\-libguestfs\-appliances\-in\-parallel\-part\-2 .PP http://rwmj.wordpress.com/2013/02/25/multiple\-libguestfs\-appliances\-in\-parallel\-part\-3 .PP http://rwmj.wordpress.com/2013/02/25/multiple\-libguestfs\-appliances\-in\-parallel\-part\-4 .PP .Vb 1 \& #!/usr/bin/env perl \& \& use strict; \& use threads; \& use warnings; \& use Sys::Guestfs; \& use Time::HiRes qw(time); \& \& sub test { \& my $g = Sys::Guestfs\->new; \& $g\->add_drive_ro ("/dev/null"); \& $g\->launch (); \& \& # You could add some work for libguestfs to do here. \& \& $g\->close (); \& } \& \& # Get everything into cache. \& test (); test (); test (); \& \& for my $nr_threads (1..20) { \& my $start_t = time (); \& my @threads; \& foreach (1..$nr_threads) { \& push @threads, threads\->create (\e&test) \& } \& foreach (@threads) { \& $_\->join (); \& if (my $err = $_\->error ()) { \& die "launch failed with $nr_threads threads: $err" \& } \& } \& my $end_t = time (); \& printf ("%d %.2f\en", $nr_threads, $end_t \- $start_t); \& } .Ve .SH "عیب‌یابی کارایی ضعیف (TROUBLESHOOTING POOR PERFORMANCE)" .IX Header "TROUBLESHOOTING POOR PERFORMANCE" .SS "اطمینان از در دسترس بودن مجازی‌سازی سخت‌افزاری (Ensure hardware virtualization is available)" .IX Subsection "Ensure hardware virtualization is available" از \fI/proc/cpuinfo\fR برای اطمینان از در دسترس بودن مجازی‌سازی سخت‌افزاری استفاده کنید. توجه داشته باشید که ممکن است لازم باشد آن را در تنظیمات BIOS خود فعال نمایید. .PP مجازی‌سازی سخت‌افزاری معمولاً در داخل ماشین‌های مجازی در دسترس نیست، و .B libguestfs درون یک ماشین مجازی دیگر به هر حال کند اجرا خواهد شد. بر اساس تجربه ما، مجازی‌سازی تو در تو (Nested virtualization) به خوبی کار نمی‌کند و مسلماً جایگزینی برای اجرای .B libguestfs روی سخت‌افزار واقعی (baremetal) نیست. .SS "اطمینان از در دسترس بودن KVM (Ensure KVM is available)" .IX Subsection "Ensure KVM is available" اطمینان حاصل کنید که KVM فعال است و برای کاربری که .B libguestfs را اجرا می‌کند در دسترس قرار دارد. تنظیم دسترسی‌های 0666 روی \fI/dev/kvm\fR باید ایمن باشد و بیشتر توزیع‌ها امروزه این کار را انجام می‌دهند. .SS "پردازنده‌هایی که باید از آن‌ها اجتناب کرد (Processors to avoid)" .IX Subsection "Processors to avoid" از پردازنده‌هایی که فاقد مجازی‌سازی سخت‌افزاری هستند، و برخی پردازنده‌ها که بسیار کند هستند (AMD Geode نمونه بارز آن است) اجتناب کنید. .SS "سامانه Xen dom0 (Xen dom0)" .IX Subsection "Xen dom0" در ،Xen دامنه dom0 یک ماشین مجازی است، بنابراین مجازی‌سازی سخت‌افزاری در آن در دسترس نیست. .SS "استفاده از libguestfs >= 1.34 و qemu >= 2.7 (Use libguestfs >= 1.34 and qemu >= 2.7)" .IX Subsection "Use libguestfs >= 1.34 and qemu >= 2.7" در طول چرخه توسعه ،libguestfs 1.33 ما زمان زیادی را صرف تمرکز روی کارایی بوت کردیم و وصله‌هایی را به ،libguestfs .B qemu و لینوکس اضافه کردیم که در برخی موارد می‌توانند زمان بوت را به کمتر از ۱ ثانیه کاهش دهند. بنابراین، با مهاجرت به نسخه‌هایی از .B libguestfs یا .B qemu که در عنوان ذکر شد، ممکن است به کارایی بسیار بهتری دست یابید. .SH "تحلیل دقیق (DETAILED ANALYSIS)" .IX Header "DETAILED ANALYSIS" .SS "تحلیل بوت (Boot analysis)" .IX Subsection "Boot analysis" در نشانی https://github.com/libguestfs/libguestfs\-analysis\-tools برنامه‌ای به نام \f(CW\*(C`boot\-analysis\*(C'\fR وجود دارد. این برنامه می‌تواند تفکیک بسیار دقیقی از مراحل بوت (مانند ،qemu ،BIOS کرنل، اسکریپت init مربوط به libguestfs) تولید کند و مدت‌زمان لازم برای انجام هر مرحله را بسنجد. .SS "زمان‌بندی دقیق با استفاده از ts (Detailed timings using ts)" .IX Subsection "Detailed timings using ts" از دستور \fBts\fR\|(1) (از مجموعه moreutils) برای نمایش زمان‌بندی دقیق استفاده کنید: .PP .Vb 10 \& $ guestfish \-a /dev/null run \-v |& ts \-i \*(Aq%.s\*(Aq \& 0.000022 libguestfs: launch: program=guestfish \& 0.000134 libguestfs: launch: version=1.29.31fedora=23,release=2.fc23,libvirt \& 0.000044 libguestfs: launch: backend registered: unix \& 0.000035 libguestfs: launch: backend registered: uml \& 0.000035 libguestfs: launch: backend registered: libvirt \& 0.000032 libguestfs: launch: backend registered: direct \& 0.000030 libguestfs: launch: backend=libvirt \& 0.000031 libguestfs: launch: tmpdir=/tmp/libguestfsw18rBQ \& 0.000029 libguestfs: launch: umask=0002 \& 0.000031 libguestfs: launch: euid=1000 \& 0.000030 libguestfs: libvirt version = 1002012 (1.2.12) \& [etc] .Ve .PP برچسب‌های زمانی بر حسب ثانیه هستند (به‌صورت افزایشی از خط قبلی). .SS "اشکال‌زدایی دقیق با استفاده از gdb (Detailed debugging using gdb)" .IX Subsection "Detailed debugging using gdb" می‌توانید با استفاده از gdb به BIOS/kernel اپلاینس متصل شوید. اگر به این کار تسلط دارید، این روش می‌تواند راهکار مفیدی برای عیب‌یابی پسرفت‌های بوت باشد. .PP نخست، باید qemu را طوری تنظیم کنید که با گزینه‌های \f(CW\*(C`\-S\*(C'\fR و \f(CW\*(C`\-s\*(C'\fR اجرا شود. این گزینه‌ها موجب مکث qemu هنگام بوت شده و به شما امکان اتصال دیباگر را می‌دهند. برای اطلاعات بیشتر، \fBqemu\fR\|(1) را بخوانید. .B Libguestfs دستور qemu را چندین بار فراخوانی می‌کند (جهت بررسی خروجی راهنما و موارد دیگر) و شما تنها می‌خواهید آخرین فراخوانی qemu از این گزینه‌ها استفاده کند؛ بنابراین از یک اسکریپت پوششی (wrapper) برای qemu مانند نمونه زیر استفاده کنید: .PP .Vb 1 \& #!/bin/bash \- \& \& # Set this to point to the real qemu binary. \& qemu=/usr/bin/qemu\-kvm \& \& if [ "$1" != "\-global" ]; then \& # Scanning help output etc. \& exec $qemu "$@" \& else \& # Really running qemu. \& exec $qemu \-S \-s "$@" \& fi .Ve .PP اکنون guestfish یا ابزار دیگر .B libguestfs را به همراه اسکریپت پوششی qemu اجرا کنید (برای درک سازوکار این بخش، "QEMU WRAPPERS" در \fBguestfs\fR\|(3) را مطالعه نمایید): .PP .Vb 1 \& LIBGUESTFS_HV=/path/to/qemu\-wrapper guestfish \-a /dev/null \-v run .Ve .PP این دستور باید درست پس از راه‌اندازی qemu مکث کند. در پنجره‌ای دیگر، با استفاده از gdb به qemu متصل شوید: .PP .Vb 7 \& $ gdb \& (gdb) set architecture i8086 \& The target architecture is assumed to be i8086 \& (gdb) target remote :1234 \& Remote debugging using :1234 \& 0x0000fff0 in ?? () \& (gdb) cont .Ve .PP در این مرحله می‌توانید تکنیک‌های استاندارد gdb مانند زدن \f(CW\*(C`^C\*(C'\fR برای وقفه در بوت، \f(CW\*(C`bt\*(C'\fR برای دریافت ردگیری پشته (stack trace)، تنظیم نقاط شکست (breakpoints) و غیره را به کار ببرید. توجه داشته باشید پس از گذر از BIOS و ورود به کرنل لینوکس، باید معماری را دوباره به ۳۲ یا ۶۴ بیتی برگردانید. .SH "پسرفت‌های کارایی در سایر برنامه‌ها (PERFORMANCE REGRESSIONS IN OTHER PROGRAMS)" .IX Header "PERFORMANCE REGRESSIONS IN OTHER PROGRAMS" گاهی اوقات پسرفت‌های کارایی در سایر برنامه‌ها (مانند qemu یا کرنل) رخ می‌دهد که مشکلاتی را برای .B libguestfs به وجود می‌آورند. .PP در نشانی https://github.com/libguestfs/libguestfs\-analysis\-tools اسکریپتی به نام \&\fIboot\-benchmark/boot\-benchmark\-range.pl\fR وجود دارد که می‌تواند برای ارزیابی کارایی (benchmark) .B libguestfs در بازه‌ای از کامیت‌های گیت در یک پروژه دیگر استفاده شود تا مشخص شود آیا کامیتی باعث افت سرعت (یا بهبود آن) شده است یا خیر. .PP برای آشنایی با نحوه استفاده از این اسکریپت، راهنمای آن را مطالعه کنید: .PP .Vb 1 \& ./boot\-benchmark/boot\-benchmark\-range.pl \-\-man .Ve .SH "همچنین ببینید (SEE ALSO)" .IX Header "SEE ALSO" \&\fBsupermin\fR\|(1), \&\fBguestfish\fR\|(1), \&\fBguestfs\fR\|(3), \&\fBguestfs\-examples\fR\|(3), \&\fBguestfs\-internals\fR\|(1), \&\fBlibguestfs\-make\-fixed\-appliance\fR\|(1), \&\fBstap\fR\|(1), \&\fBqemu\fR\|(1), \&\fBgdb\fR\|(1), http://libguestfs.org .SH "نویسندگان (AUTHORS)" .IX Header "AUTHORS" Richard W.M. Jones (\f(CW\*(C`rjones at redhat dot com\*(C'\fR) .SH "حق نشر (COPYRIGHT)" .IX Header "COPYRIGHT" Copyright (C) 2012\-2025 Red Hat Inc. .SH "مجوز (LICENSE)" .IX Header "LICENSE" این کتابخانه یک نرم‌افزار آزاد است؛ شما می‌توانید آن را تحت شرایط «مجوز عمومی جامع‌تر گنو» (GNU Lesser General Public License) همان‌طور که توسط بنیاد نرم‌افزارهای آزاد منتشر شده است، چه نسخه ۲ مجوز و چه (به انتخاب خودتان) هر نسخه بعدی، بازتوزیع کرده و/یا تغییر دهید. .PP این کتابخانه با این امید توزیع شده است که مفید واقع شود، اما بدون هیچ‌گونه ضمانت؛ حتی بدون ضمانت ضمنی قابلیت فروش یا تناسب با یک هدف خاص. برای جزئیات بیشتر به «مجوز عمومی جامع‌تر گنو» مراجعه کنید. .PP شما باید همراه با این کتابخانه یک نسخه از «مجوز عمومی جامع‌تر گنو» را دریافت کرده باشید؛ در غیر این صورت، با بنیاد نرم‌افزارهای آزاد مکاتبه کنید: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110\-1301 USA .SH "اشکالات (BUGS)" .IX Header "BUGS" برای مشاهده فهرست اشکالات ثبت‌شده علیه libguestfs، از این پیوند استفاده کنید: https://bugzilla.redhat.com/buglist.cgi?component=libguestfs&product=Virtualization+Tools .PP جهت گزارش یک اشکال جدید در libguestfs، از این پیوند استفاده کنید: https://bugzilla.redhat.com/enter_bug.cgi?component=libguestfs&product=Virtualization+Tools .PP هنگام گزارش اشکال، لطفاً موارد زیر را ارائه دهید: .IP \(bu 4 نسخه .BR libguestfs . .IP \(bu 4 جایی که libguestfs را از آن دریافت کرده‌اید (برای مثال کدام توزیع لینوکس، کامپایل از کد منبع و غیره). .IP \(bu 4 اشکال را به‌دقت شرح داده و روشی برای بازتولید آن ارائه نمایید. .IP \(bu 4 دستور \fBlibguestfs\-test\-tool\fR\|(1) را اجرا کرده و خروجی \fBکامل و دست‌نخورده\fR را در گزارش اشکال قرار دهید.