| erl(1) | Erlang Module Definition | erl(1) |
نام (NAME)
erl - راهاندازی سیستم زمان اجرای ارلنگ
توضیحات (DESCRIPTION)
برنامه erl یک سیستم زمان اجرای ارلنگ را راهاندازی میکند. جزئیات دقیق (به عنوان مثال، اینکه آیا erl یک اسکریپت است یا یک برنامه، و اینکه چه برنامههای دیگری را فراخوانی میکند) وابسته به سیستم است.
نکته: اگر در ویندوز از Erlang/OTP 25 یا نسخههای پیش از آن استفاده میکنید و میخواهید یک سیستم ارلنگ را با پشتیبانی کامل از شل راهاندازی کنید، باید از werl.exe استفاده نمایید. برای جزئیات نحوه انجام این کار، به مستندات Erlang/OTP 25 مراجعه کنید.
erl <arguments>
یک سیستم زمان اجرای ارلنگ را راهاندازی میکند.
آرگومانها را میتوان به فلگهای شبیهساز، فلگها و آرگومانهای ساده تقسیم کرد:
همانطور که از نام آن مشخص است، فلگهای شبیهساز رفتار شبیهساز را کنترل میکنند.
فرآیند init خود برخی از این فلگها را تفسیر میکند که فلگهای init نامیده میشوند. همچنین سایر فلگهای باقیمانده را ذخیره میکند که فلگهای کاربر نام دارند. مورد اخیر را میتوان با فراخوانی init:get_argument/1 بازیابی کرد.
تعداد اندکی از فلگهای "-" وجود دارند که در واقع فلگ شبیهساز هستند؛ به توضیحات زیر مراجعه نمایید.
مثالها:
-
% erl +W w -sname arnie +S 2 -s my_init -extra +bertie (arnie@host)1> init:get_argument(sname). {ok,[["arnie"]]} (arnie@host)2> init:get_plain_arguments(). ["+bertie"]
در اینجا +W w و +S 2 فلگهای شبیهساز هستند. -s my_init یک فلگ init است که توسط init تفسیر میشود. -sname arnie یک فلگ کاربر است که توسط init ذخیره میشود؛ این گزینه توسط Kernel خوانده شده و سبب توزیعشدن سیستم زمان اجرای ارلنگ میگردد. در پایان، هر آنچه پس از -extra بیاید (یعنی +bertie) به عنوان آرگومانهای ساده تلقی میشود.
-
% erl -myflag 1 1> init:get_argument(myflag). {ok,[["1"]]} 2> init:get_plain_arguments(). []
در اینجا فلگ کاربر -myflag 1 به فرآیند init تحویل داده شده و توسط آن ذخیره میشود. این یک فلگ تعریفشده توسط کاربر است که احتمالاً توسط برنامهای از پیش تعریفشده توسط کاربر مورد استفاده قرار میگیرد.
فلگها (Flags)
در فهرست زیر، فلگهای init با "(init flag)" مشخص شدهاند. مگر در مواردی که خلاف آن تصریح شده باشد، تمامی فلگهای دیگر از نوع فلگهای کاربر هستند که مقادیر آنها را میتوان با فراخوانی init:get_argument/1 به دست آورد. توجه داشته باشید که فهرست فلگهای کاربر جامع نیست و ممکن است فلگهای اختصاصی برنامههای دیگری نیز وجود داشته باشد که در مستندات مربوط به همان برنامهها شرح داده شدهاند.
-- (init flag)
-Application Par Val
-args_file FileName
فایل FileName باید یک فایل متنی ساده باشد و میتواند شامل توضیحات و آرگومانهای خط فرمان باشد. یک توضیح با نویسه # آغاز میشود و تا نویسه پایان خط بعدی ادامه مییابد. از بکاسلش (\) به عنوان نویسه نقلقول استفاده میشود. تمام آرگومانهای خط فرمان پذیرفتهشده توسط erl مجاز هستند، از جمله فلگ -args_file FileName. با این حال دقت کنید که بین فایلهای حاوی فلگ -args_file وابستگی دورانی ایجاد نکنید.
با فلگ -extra به شیوه خاصی رفتار میشود. دامنه آن در پایان فایل خاتمه مییابد. آرگومانهای پس از یک فلگ -extra در خط فرمان به بخش -extra، یعنی انتهای خط فرمان پس از فلگ -extra منتقل میشوند.
-async_shell_start
-boot File
پیشفرض $ROOT/bin/start.boot است.
-boot_var Var Dir
-code_path_cache
-compile Mod1 Mod2 ...
توصیه نمیشود؛ در عوض از erlc استفاده کنید.
-config Config [Config ...]
-configfd FD [FD ...]
یک توصیفکننده فایل پیکربندی تا پایان خوانده شده و سپس بسته خواهد شد.
محتوای یک توصیفکننده فایل پیکربندی ذخیره میشود تا هنگام فراخوانی init:restart/0 یا init:restart/1 مجدداً قابل استفاده باشد.
پارامتر -configfd 0 مستلزم -noinput است.
نکته: استفاده از توصیفکنندههای فایل ۱ (خروجی استاندارد) و ۲ (خطای استاندارد) به همراه -configfd توصیه نمیشود، چرا که این توصیفکنندهها معمولاً برای چاپ اطلاعات در کنسولی که برنامه در آن اجرا میشود به کار میروند.
مثالها (شل یونیکس):
-
$ erl \ -noshell \ -configfd 3 \ -eval \ <(echo '[{kernel, [{logger_level, warning}]}].') {ok,warning} -
$ echo '[{kernel, [{logger_level, warning}]}].' > test1.config $ echo '[{kernel, [{logger_level, error}]}].' > test2.config $ erl \ -noshell \ -configfd 3 \ -configfd 4 \ -eval \ 3< test1.config 4< test2.config {ok,error}
-connect_all false
-cookie Cookie
-detached
-disable-feature feature
-dist_listen true|false
-emu_args
-emu_flavor emu|jit|smp
-emu_type Type
-enable-feature feature
-env Variable Value
-
% erl -env DISPLAY gin:0
در این مثال، یک سیستم زمان اجرای ارلنگ با متغیر محیطی DISPLAY تنظیمشده روی gin:0 اجرا میشود.
-epmd_module Module
-erl_epmd_port Port
-eval Expr (init flag)
-extra (init flag)
-heart
-hidden
-hosts Hosts
آدرسهای IP باید به شکل استاندارد (چهار عدد دهدهی جداشده با نقطه، مثلاً "150.236.20.74") مشخص شوند. نامهای میزبان پذیرفته نمیشوند، اما آدرس پخش همگانی (broadcast) (ترجیحاً محدود به شبکه محلی) پذیرفته میشود.
-id Id
-init_debug
-instr (emulator flag)
-loader Loader
اگر Loader مقدار دیگری باشد، برنامه درگاه Loader ارائهشده توسط کاربر اجرا میشود.
-make
-man Module
-mode interactive | embedded
-name Name
نام گره به صورت Name@Host خواهد بود، که در آن Host نام میزبان کاملاً واجد شرایط (FQDN) از میزبان جاری است. برای نامهای کوتاه، در عوض از فلگ -sname استفاده نمایید.
اگر Name روی undefined تنظیم شده باشد، گره در حالت ویژهای راهاندازی میشود که برای کلاینت موقت یک گره دیگر بودن بهینهسازی شده است. سپس گره از اولین گرهای که به آن متصل میشود، یک نام گره پویا درخواست میکند. در Dynamic Node Name بیشتر بخوانید.
هشدار: راهاندازی یک گره توزیعشده بدون مشخص کردن همزمان -proto_dist inet_tls، گره را در معرض حملاتی قرار میدهد که ممکن است به مهاجم دسترسی کامل به گره و در نتیجه کل کلاستر را بدهد. هنگام استفاده از گرههای توزیعشده غیرامن، اطمینان حاصل کنید که شبکه طوری پیکربندی شده است که مهاجمان احتمالی را بیرون نگه دارد.
-nocookie
هنگامی که از این فلگ استفاده شود، گره در زمان راهاندازی فایل ~/.erlang.cookie را نخواهد خواند.
کوکی خود گره در وضعیت "undefined" باقی میماند مگر اینکه بعداً صریحاً از طریق erlang:set_cookie/1 یا erlang:set_cookie/2 تنظیم گردد.
این کار عملاً از مشارکت گره در یک کلاستر توزیعشده ارلنگ با گرههایی که نیاز به احراز هویت کوکی دارند جلوگیری میکند. عمدتاً برای گرههایی به کار میرود که قرار است ایزوله و مستقل باشند.
-no_epmd
این گزینه تضمین میکند که سیستم زمان اجرای ارلنگ epmd را اجرا نکند و فرآیند erl_epmd را نیز برای توزیع راهاندازی ننماید.
این گزینه تنها زمانی کار میکند که ارلنگ به عنوان یک گره توزیعشده با گزینه -proto_dist و با استفاده از یک پروتکل جایگزین برای توزیع ارلنگ راهاندازی شود که برای ثبت و کشف گرهها به epmd وابسته نباشد. برای اطلاعات بیشتر، به راهنمای How to implement an Alternative Carrier for the Erlang Distribution مراجعه کنید.
-noinput
-noshell
-nostick
-oldshell
-pa Dir1 Dir2 ...
به عنوان جایگزینی برای -pa، چنانچه قرار است چندین دایرکتوری به ابتدای مسیر کد افزوده شوند و دارای یک دایرکتوری والد مشترک هستند، آن دایرکتوری والد میتواند در متغیر محیطی ERL_LIBS مشخص گردد؛ به code مراجعه کنید.
-pz Dir1 Dir2 ...
-path Dir1 Dir2 ...
-proto_dist Proto
inet_tcp
inet_tls
inet6_tcp
به عنوان مثال، برای راهاندازی گرههای توزیعشده با IPv6:
-
% erl -name test@ipv6node.example.com -proto_dist inet6_tcp
-remsh Node
اگر هیچ -name یا -sname مشخص نشده باشد، گره با استفاده از -sname undefined راهاندازی خواهد شد. اگر Node شامل نام میزبان نباشد، نام میزبان به طور خودکار از -name یا -sname اخذ میشود.
نکته: پیش از OTP-23، کاربر باید یک -sname یا -name معتبر برای کارکرد -remsh فراهم میکرد. اگر گره مقصد نسخهای قدیمیتر از OTP-23 را اجرا کند، هنوز هم وضعیت چنین است.
نکته: گره متصلشونده باید دارای یک شل مناسب با شبیهسازی ترمینال باشد. این بدان معناست که کاربران یونیکس باید از ارلنگ کامپایلشده با قابلیتهای ترمینال استفاده کنند و پیش از Erlang/OTP 25 کاربران ویندوز باید از werl بهره بگیرند.
-rsh Program
-S Mod [Func [Arg1, Arg2, ...]] (init flag)
-run Mod [Func [Arg1, Arg2, ...]] (init flag)
-s Mod [Func [Arg1, Arg2, ...]] (init flag)
-setcookie Cookie
-setcookie Node Cookie
-shutdown_time Time
-sname Name
در صورتی که سامانه نام دامنه (DNS) در حال اجرا نباشد، این گزینه گاهی اوقات تنها راه برای اجرای ارلنگ توزیعشده است. هیچ ارتباطی میان گرههای اجراشده با فلگ -sname و گرههای اجراشده با فلگ -name نمیتواند برقرار شود، چرا که نام گرهها در سیستمهای ارلنگ توزیعشده باید منحصربهفرد باشد.
اگر Name روی undefined تنظیم شود، گره در حالت ویژهای راهاندازی خواهد شد که برای کلاینت موقت گره دیگر بودن بهینهسازی شده است. سپس گره از نخستین گرهای که به آن متصل شود درخواست یک نام گره پویا میکند. در Dynamic Node Name بیشتر بخوانید.
هشدار: راهاندازی یک گره توزیعشده بدون مشخص کردن همزمان -proto_dist inet_tls، گره را در معرض حملاتی قرار میدهد که ممکن است به مهاجم دسترسی کامل به گره و در نتیجه کل کلاستر را بدهد. هنگام استفاده از گرههای توزیعشده غیرامن، اطمینان حاصل کنید که شبکه طوری پیکربندی شده است که مهاجمان احتمالی را بیرون نگه دارد.
-start_epmd true | false
این فلگ تنها در صورتی اثر دارد که ارلنگ به عنوان یک گره توزیعشده راهاندازی شود، یعنی -name یا -sname مشخص شده باشد. در غیر این صورت، حتی اگر -start_epmd true مشخص شود، epmd راهاندازی نخواهد شد.
توجه داشته باشید که اگر epmd در حال اجرا نباشد، راهاندازی گره توزیعشده با شکست مواجه میشود.
-version (emulator flag)
فلگهای شبیهساز (Emulator Flags)
دستور erl کد مربوط به شبیهساز (ماشین مجازی) ارلنگ را فراخوانی میکند که از فلگهای زیر پشتیبانی مینماید. فلگها از چپ به راست خوانده میشوند و فلگهای بعدی رفتار فلگهای قبلی را بازنویسی (override) میکنند.
+a size
+A size
+B [c | d | i]
اگر گزینه c همراه با oldshell در یونیکس استفاده شود، کلید ترکیبی Ctrl-C به جای توقف، فرآیند شل را بازراهاندازی خواهد کرد.
+c true | false
true
false
برای سازگاری با گذشته، مقدار بولی میتواند حذف شود که در این صورت به عنوان +c false تفسیر خواهد شد.
+C no_time_warp | single_time_warp | multi_time_warp
no_time_warp
single_time_warp
multi_time_warp
+d
گزینه +d به شبیهساز دستور میدهد که در صورت شناسایی خطای داخلی، تنها یک core dump تولید کرده و هیچ گزارش خرابی تولید نکند.
فراخوانی erlang:halt/1 با یک آرگومان رشتهای همچنان یک گزارش خرابی تولید میکند. در سیستمهای یونیکس، ارسال سیگنال SIGUSR1 به فرآیند شبیهساز نیز ایجاد گزارش خرابی را اجباری میکند.
+dcg DecentralizedCounterGroupsLimit
هنگامی که تعداد زمانبندها کمتر یا مساوی این محدودیت باشد، هر زمانبند گروه اختصاصی خود را دارد. هنگامی که تعداد زمانبندها بیشتر از محدودیت گروهها باشد، زمانبندها گروهها را به اشتراک میگذارند. گروههای مشترک کارایی بهروزرسانی شمارندهها را کاهش میدهند، در حالی که وجود گروههای خواننده پرتعداد کارایی خواندن شمارندهها را تقلیل میدهد. بنابراین، این حد مصالحهای میان کارایی عملیات بهروزرسانی و کارایی عملیات خواندن است. هر گروه ۶۴ بایت در هر شمارنده مصرف میکند.
توجه داشته باشید که یک سیستم زمان اجرا که از گروههای شمارنده نامتمرکز استفاده میکند، از مقید کردن زمانبندها به پردازندههای منطقی سود میبرد، زیرا با این گزینه گروهها به شکل بهتری میان زمانبندها توزیع میشوند.
این گزینه تنها بر شمارندههای نامتمرکزی تأثیر میگذارد که برای رهگیری مصرف حافظه و تعداد عبارتها (terms) در جداول ETS از نوع ordered_set با فعال بودن گزینه write_concurrency استفاده میشوند.
+e Number
+ec
+fnl
برای اطلاعات بیشتر درباره نامهای فایل یونیکد، به بخش Unicode Filenames در راهنمای کاربر STDLIB مراجعه کنید. توجه داشته باشید که این مقدار برای پارامترهای خط فرمان و متغیرهای محیطی نیز اعمال میشود (بخش Unicode in Environment and Parameters را در راهنمای کاربر STDLIB ببینید).
+fnu[{w|i|e}]
سوییچ +fnu میتواند با w، i یا e دنبال شود تا نحوه گزارش نامهای فایل با کدگذاری نادرست را کنترل کند:
توجه داشته باشید که اگر پیوند به یک نام فایل نامعتبر اشاره کند، file:read_link/1 همیشه یک خطا بازمیگرداند.
برای اطلاعات بیشتر درباره نامهای فایل یونیکد، به بخش Unicode Filenames در راهنمای کاربر STDLIB مراجعه کنید. توجه داشته باشید که این مقدار برای پارامترهای خط فرمان و متغیرهای محیطی نیز اعمال میشود (بخش Unicode in Environment and Parameters را در راهنمای کاربر STDLIB ببینید).
+fna[{w|i|e}]
سوییچ +fna میتواند با w، i یا e دنبال شود. این گزینه در صورتی اثرگذار است که تنظیمات محلی سبب انتخاب رفتار +fnu شوند؛ توضیحات مربوط به +fnu در بالا را ببینید. چنانچه تنظیمات محلی سبب انتخاب رفتار +fnl شوند، w، i یا e اثری نخواهند داشت.
برای اطلاعات بیشتر درباره نامهای فایل یونیکد، به بخش Unicode Filenames در راهنمای کاربر STDLIB مراجعه کنید. توجه داشته باشید که این مقدار برای پارامترهای خط فرمان و متغیرهای محیطی نیز اعمال میشود (بخش Unicode in Environment and Parameters را در راهنمای کاربر STDLIB ببینید).
+hms Size
+hmbs Size
+hmax Size
+hmaxel true|false
+hmaxib true|false
+hmaxk true|false
+hpds Size
+hmqd off_heap|on_heap
+IOp PollSets
+IOt PollThreads
یک راه مناسب برای بررسی نیاز به نخهای نظرسنجی بیشتر I/O، استفاده از حسابداری وضعیت خرد (microstate accounting) و بررسی بار کاری نخ نظرسنجی I/O است. در صورت بالا بودن بار، افزودن نخهای بیشتر ایده مناسبی خواهد بود.
+IOPp PollSetsPercentage
+IOPt PollThreadsPercentage
+IOs true|false
در صورت فعال بودن، توصیفکنندههای فایلی که مکرراً خوانده میشوند ممکن است به یک pollset ویژه مورد استفاده نخهای زمانبند منتقل شوند. هدف از این کار کاهش تعداد فراخوانیهای سیستمی و در نتیجه بار CPU است، با این حال در برخی موارد ممکن است تأخیر زمانبندی را برای رویدادهای ورودی توصیفکننده فایل منفرد افزایش دهد.
پشتیبانی از پوشش کد (coverage) را هنگام اجرا با JIT فعال یا غیرفعال میکند. پیشفرض false است.
function
function_counters
line
line_counters
true
false
از نسخه: OTP 27.0
+JPperf true|false|dump|map|fp|no_fp
این گزینه را میتوان چندین بار برای فعالسازی گزینههای متعدد ترکیب کرد:
dump
map
fp
no_fp
true
false
برای جزئیات بیشتر درباره نحوه اجرای perf، به بخش پشتیبانی perf در مستندات داخلی BeamAsm مراجعه فرمایید.
+JPperfdirectory <directory>
+JMsingle true|false
حالت پیشفرض این است که کد ماشین تولیدشده توسط JIT در دو ناحیه با صفحات فیزیکی یکسان نگاشت شود که یک ناحیه قابل اجرا اما غیرقابل نوشتن، و دیگری قابل نوشتن اما غیرقابل اجرا باشد. از آنجا که برخی ابزارها مانند شبیهساز حالت کاربر QEMU نمیتوانند با نگاشت دوگانه کار کنند، این فلگ امکان غیرفعال کردن آن را فراهم میآورد. این فلگ به طور خودکار توسط فلگ +JPperf فعال میشود.
از نسخه: OTP 26.0
+L
+MFlag Value
+pad true|false
به طور پیشفرض، اگر هیچ گزینه خط فرمانی با +pad ارسال نشود، فلگ async_dist روی false تنظیم خواهد شد.
مقدار استفادهشده در زمان اجرا را میتوان با فراخوانی erlang:system_info(async_dist) بررسی کرد.
از نسخه: OTP 25.3
+pc Range
دو مقدار برای Range پشتیبانی میشود:
latin1
unicode
همچنین به io:printable_range/0 در STDLIB مراجعه کنید.
+P Number
نکته: حداکثر مقدار واقعی انتخابشده ممکن است بسیار بزرگتر از Number ارسالی باشد. در حال حاضر سیستم زمان اجرا اغلب (اما نه همیشه) مقداری را انتخاب میکند که توانی از ۲ باشد. این مورد ممکن است در آینده تغییر کند. مقدار واقعی انتخابشده را میتوان با فراخوانی erlang:system_info(process_limit) بررسی کرد.
مقدار پیشفرض 1048576 است.
+Q Number
نکته: حداکثر مقدار واقعی انتخابشده ممکن است بسیار بزرگتر از Number واقعی ارسالی باشد. در حال حاضر سیستم زمان اجرا معمولاً (اما نه همیشه) مقداری را انتخاب میکند که توانی از ۲ باشد. این مورد ممکن است در آینده تغییر کند. مقدار واقعی انتخابشده را میتوان با فراخوانی erlang:system_info(port_limit) بررسی کرد.
مقدار پیشفرض مورد استفاده معمولاً 65536 است. با این حال، اگر سیستم زمان اجرا بتواند حداکثر تعداد توصیفکنندههای فایلی را که مجاز به باز کردن آنهاست تشخیص دهد و این مقدار بزرگتر از 65536 باشد، مقدار انتخابی به مقداری بزرگتر یا مساوی با حداکثر تعداد توصیفکنندههای فایلی که میتوانند باز شوند افزایش مییابد.
در ویندوز، مقدار پیشفرض روی 8196 تنظیم شده است، زیرا محدودیتهای معمول سیستمعامل فراتر از توان کاری اکثر ماشینها تنظیم شده است.
+r
+rg ReaderGroupsLimit
هنگامی که تعداد زمانبندها کمتر یا مساوی محدودیت گروههای خواننده باشد، هر زمانبند گروه خواننده اختصاصی خود را دارد. هنگامی که تعداد زمانبندها بیشتر از محدودیت گروههای خواننده باشد، زمانبندها گروههای خواننده را به اشتراک میگذارند. گروههای خواننده مشترک کارایی قفل و آزادسازی خواندن را کاهش میدهند، در حالی که گروههای خواننده پرتعداد کارایی قفل نوشتن را کاهش میدهند. بنابراین، این محدودیت مصالحهای بین کارایی عملیات خواندن و کارایی عملیات نوشتن است. هر گروه خواننده ۶۴ بایت در هر قفل خواندن/نوشتن مصرف میکند.
توجه داشته باشید که یک سیستم زمان اجرا که از گروههای خواننده مشترک استفاده میکند، از مقید کردن زمانبندها به پردازندههای منطقی بهرهمند میشود، زیرا گروههای خواننده به شکل بهتری میان زمانبندها توزیع میگردند.
+S Schedulers:SchedulerOnline
اگر :SchedulerOnline مشخص شده باشد، میتوان Schedulers را حذف کرد و برعکس. تعداد زمانبندهای آنلاین را میتوان در زمان اجرا از طریق erlang:system_flag(schedulers_online, SchedulersOnline) تغییر داد.
اگر Schedulers یا SchedulersOnline به صورت یک عدد منفی مشخص شوند، مقدار مربوطه به ترتیب از تعداد پیشفرض پردازندههای منطقی پیکربندیشده یا پردازندههای منطقی موجود کسر میشود.
مشخص کردن مقدار 0 برای Schedulers یا SchedulersOnline به ترتیب تعداد نخهای زمانبند یا نخهای زمانبند آنلاین را به مقدار پیشفرض بازنشانی میکند.
+SP SchedulersPercentage:SchedulersOnlinePercentage
این گزینه با تنظیمات +S تعامل دارد. به عنوان مثال، روی سیستمی با ۸ هسته منطقی پیکربندیشده و ۸ هسته منطقی موجود، ترکیب گزینههای +S 4:4 +SP 50:25 (به هر ترتیبی) منجر به ۲ نخ زمانبند (۵۰٪ از ۴) و ۱ نخ زمانبند آنلاین (۲۵٪ از ۴) میشود.
+SDcpu DirtyCPUSchedulers:DirtyCPUSchedulersOnline
برای جزئیات، به +S و +SP مراجعه کنید. به طور پیشفرض، تعداد نخهای زمانبند کثیف CPU ایجادشده با تعداد نخهای زمانبند معمولی ایجادشده برابر است، و تعداد نخهای زمانبند کثیف CPU آنلاین با تعداد نخهای زمانبند معمولی آنلاین برابر است. اگر :DirtyCPUSchedulersOnline مشخص شده باشد میتوان DirtyCPUSchedulers را حذف کرد و برعکس. تعداد زمانبندهای کثیف CPU آنلاین را میتوان در زمان اجرا از طریق erlang:system_flag(dirty_cpu_schedulers_online, DirtyCPUSchedulersOnline) تغییر داد.
میزان زمانبندهای کثیف CPU به میزان زمانبندهای معمولی محدود میشود تا تأثیر بر فرآیندهای در حال اجرا روی زمانبندهای معمولی محدود گردد. اگر مقدار زمانبندهای کثیف CPU نامحدود میبود، کارهای وابسته به CPU کثیف پتانسیل گرسنگی دادن (starvation) به کارهای معمولی را داشتند.
کاربران معمول زمانبندهای کثیف CPU عبارتند از عملیات بزرگ جمعآوری زباله (garbage collection)، انکودرها/دیکودرهای پروتکل json که به عنوان NIF نوشته شدهاند و کتابخانههای محاسبات ماتریسی.
میتوانید از msacc برای مشاهده بار کاری فعلی نخهای زمانبندهای کثیف CPU و تنظیم تعداد مورد استفاده متناسب با آن بهره بگیرید.
+SDPcpu DirtyCPUSchedulersPercentage:DirtyCPUSchedulersOnlinePercentage
این گزینه با تنظیمات +SDcpu تعامل دارد. به عنوان مثال، روی سیستمی با ۸ هسته منطقی پیکربندیشده و ۸ هسته منطقی در دسترس، ترکیب گزینههای +SDcpu 4:4 +SDPcpu 50:25 (به هر ترتیبی) منجر به ۲ نخ زمانبند کثیف CPU (۵۰٪ از ۴) و ۱ نخ زمانبند کثیف CPU آنلاین (۲۵٪ از ۴) میشود.
+SDio DirtyIOSchedulers
تعداد زمانبندهای کثیف IO بر خلاف تعداد زمانبندهای کثیف CPU توسط تعداد زمانبندهای معمولی محدود نمیشود؛ چرا که انتظار میرود تنها کارهای وابسته به ورودی/خروجی (I/O bound) روی زمانبندهای کثیف I/O اجرا شوند. اگر کاربر کارهای وابسته به CPU را روی زمانبندهای کثیف I/O زمانبندی کند، این کارها ممکن است کارهای عادی در حال اجرا روی زمانبندهای معمولی را دچار گرسنگی کنند.
کاربران معمول زمانبندهای کثیف IO خواندن و نوشتن فایلها هستند.
میتوانید از msacc استفاده کنید تا بار کاری فعلی نخهای زمانبند کثیف IO را مشاهده کرده و تعداد مورد استفاده را بر همان اساس تنظیم نمایید.
+sFlag Value
+sbt BindType
زمانبندها را میتوان با استفاده از فلگ +stbt نیز مقید کرد. تنها تفاوت میان این دو فلگ نحوه مدیریت خطاهای زیر است:
اگر هر یک از این خطاها هنگام ارسال +sbt رخ دهد، سیستم زمان اجرا یک پیام خطا چاپ کرده و از شروع به کار خودداری میکند. اگر هر یک از این خطاها هنگام ارسال +stbt رخ دهد، سیستم زمان اجرا بیصدا خطا را نادیده گرفته و با استفاده از زمانبندهای غیرمقید راهاندازی میشود.
مقادیر معتبر BindType:
u
unbound - زمانبندها به پردازندههای منطقی مقید نمیشوند؛ یعنی سیستمعامل تصمیم میگیرد که نخهای زمانبند در کجا اجرا شوند و چه زمانی مهاجرت کنند. این حالت پیشفرض است.
ns
no_spread - زمانبندها با شناسههای نزدیک به هم تا حد امکان در سختافزار نزدیک به یکدیگر مقید میشوند.
ts
thread_spread - نخ به نخهای سختافزاری اشاره دارد (مانند فناوری Hyper-Threading اینتل). زمانبندها با شناسه پایین به نخستین نخ سختافزاری هر هسته مقید میشوند، سپس زمانبندها با شناسه بالاتر به دومین نخ سختافزاری هر هسته متصل میگردند و به همین ترتیب.
ps
processor_spread - زمانبندها مانند thread_spread توزیع میشوند، اما علاوه بر آن در میان تراشههای فیزیکی پردازنده نیز پخش میگردند.
s
spread - زمانبندها تا جای ممکن به صورت گسترده توزیع میشوند.
nnts
no_node_thread_spread - مانند thread_spread است، اما در صورت وجود چندین گره NUMA، زمانبندها در هر زمان روی یک گره NUMA توزیع میشوند؛ یعنی تمام پردازندههای منطقی یک گره NUMA به ترتیب به زمانبندها مقید میشوند.
nnps
no_node_processor_spread - مانند processor_spread است، اما در صورت وجود چندین گره NUMA، زمانبندها در هر زمان روی یک گره NUMA پخش میشوند.
tnnps
thread_no_node_processor_spread - ترکیبی از thread_spread و no_node_processor_spread است. زمانبندها بر روی نخهای سختافزاری در گرههای NUMA توزیع میشوند، اما در داخل هر گره NUMA در یک زمان تنها میان پردازندهها پخش میگردند.
db
default_bind - زمانبندها را به شیوه پیشفرض مقید میکند. پیشفرض thread_no_node_processor_spread است (که ممکن است در آینده تغییر کند).
مقیدسازی زمانبندها تنها در سیستمهای جدیدتر لینوکس، سولاریس، FreeBSD و ویندوز پشتیبانی میشود.
اگر هنگام پردازش فلگ +sbt هیچ توپولوژی CPU در دسترسی نباشد و BindType هر مقداری غیر از u باشد، راهاندازی سیستم زمان اجرا با شکست مواجه میشود. توپولوژی CPU میتواند با استفاده از فلگ +sct تعریف شود. توجه داشته باشید که در صورت عدم تشخیص خودکار توپولوژی CPU، ممکن است لازم باشد فلگ +sct پیش از فلگ +sbt در خط فرمان قرار گیرد.
سیستم زمان اجرا به طور پیشفرض زمانبندها را به پردازندههای منطقی مقید نمیکند.
نکته: اگر سیستم زمان اجرای ارلنگ تنها فرآیند سیستمعامل باشد که نخها را به پردازندههای منطقی مقید میکند، این امر کارایی سیستم زمان اجرا را بهبود میبخشد. اما اگر سایر فرآیندهای سیستمعامل (برای مثال یک سیستم زمان اجرای دیگر ارلنگ) نیز نخها را به پردازندههای منطقی مقید کنند، ممکن است در عوض افت کارایی رخ دهد. این افت کارایی گاهی میتواند شدید باشد. در این شرایط، توصیه میشود زمانبندها را مقید نکنید.
نحوه مقید شدن زمانبندها اهمیت دارد. برای نمونه، در شرایطی که فرآیندهای در حال اجرا کمتر از زمانبندهای آنلاین باشند، سیستم زمان اجرا تلاش میکند فرآیندها را به زمانبندهایی با شناسه پایینتر منتقل کند. هرچه زمانبندها بیشتر روی سختافزار پخش شده باشند، منابع بیشتری در چنین شرایطی در دسترس سیستم زمان اجرا خواهد بود.
نکته: اگر یک زمانبند نتواند مقید شود، این موضوع اغلب بدون سر و صدا نادیده گرفته میشود؛ چرا که تأیید شناسههای معتبر پردازندههای منطقی همواره امکانپذیر نیست. در صورت گزارش خطا، این خطا به error_logger گزارش میشود. اگر میخواهید اطمینان حاصل کنید که زمانبندها طبق درخواست مقید شدهاند، erlang:system_info(scheduler_bindings) را فراخوانی کنید.
+sbwt none|very_short|short|medium|long|very_long
نکته: این فلگ میتواند در هر زمان و بدون اطلاع قبلی حذف یا تغییر داده شود.
+sbwtdcpu none|very_short|short|medium|long|very_long
نکته: این فلگ میتواند در هر زمان و بدون اطلاع قبلی حذف یا تغییر داده شود.
+sbwtdio none|very_short|short|medium|long|very_long
نکته: این فلگ میتواند در هر زمان و بدون اطلاع قبلی حذف یا تغییر داده شود.
+scl true|false
گزینه +scl false مشابه +sub true است، اما +sub true همچنین میزان استفاده از زمانبندها را بین آنها متعادل میکند.
+sct CpuTopology
-
<Id> = integer(); when 0 =< <Id> =< 65535 <IdRange> = <Id>-<Id> <IdOrIdRange> = <Id> | <IdRange> <IdList> = <IdOrIdRange>,<IdOrIdRange> | <IdOrIdRange> <LogicalIds> = L<IdList> <ThreadIds> = T<IdList> | t<IdList> <CoreIds> = C<IdList> | c<IdList> <ProcessorIds> = P<IdList> | p<IdList> <NodeIds> = N<IdList> | n<IdList> <IdDefs> = <LogicalIds><ThreadIds><CoreIds><ProcessorIds><NodeIds> | <LogicalIds><ThreadIds><CoreIds><NodeIds><ProcessorIds> CpuTopology = <IdDefs>:<IdDefs> | <IdDefs>
حروف بزرگ بیانگر شناسههای واقعی و حروف کوچک بیانگر شناسههای فرضی هستند که تنها برای توصیف توپولوژی استفاده میشوند. شناسههای ارائهشده به عنوان شناسههای واقعی میتوانند توسط سیستم زمان اجرا هنگام تلاش برای دسترسی به سختافزار خاص استفاده شوند؛ اگر نادرست باشند رفتار سیستم نامعین خواهد بود. شناسههای فرضی پردازنده منطقی پذیرفته نمیشوند، زیرا بدون شناسههای واقعی پردازنده منطقی، تعریف توپولوژی CPU بیمعناست. شناسههای نخ، هسته، پردازنده و گره میتوانند حذف شوند. در صورت حذف، شناسه نخ به طور پیشفرض t0، شناسه هسته c0، شناسه پردازنده p0 و شناسه گره تعریفنشده باقی میماند. یا هر پردازنده منطقی باید فقط به یک گره NUMA تعلق داشته باشد، یا هیچ پردازنده منطقی نباید به هیچ گره NUMA تعلق داشته باشد.
هر دو بازه افزایشی و کاهشی در <IdRange> مجاز هستند.
شناسههای گره NUMA در سطح کل سیستم یکتا هستند. شناسههای پردازنده نیز در سطح کل سیستم هستند. شناسههای هسته در سطح پردازنده و شناسههای نخ در سطح هسته تعریف میشوند.
ترتیب انواع شناسه، سلسلهمراتب توپولوژی CPU را مشخص میکند. ترتیبهای معتبر به شرح زیر هستند:
یک توپولوژی CPU میتواند شامل هر دو گره NUMA خارجی پردازنده و داخلی پردازنده باشد، مادامی که هر پردازنده منطقی تنها به یک گره NUMA تعلق داشته باشد. اگر <ProcessorIds> حذف شود، موقعیت پیشفرض آن پیش از <NodeIds> خواهد بود؛ یعنی پیشفرض گرههای NUMA خارجی پردازنده است.
اگر لیستی از شناسهها در یک <IdDefs> به کار رود:
یک مثال ساده. یک پردازنده چهار هستهای تک میتواند به شکل زیر توصیف شود:
-
% erl +sct L0-3c0-3 1> erlang:system_info(cpu_topology). [{processor,[{core,{logical,0}}, {core,{logical,1}}, {core,{logical,2}}, {core,{logical,3}}]}]
یک مثال پیچیدهتر با دو پردازنده چهار هستهای، که هر پردازنده در گره NUMA اختصاصی خود قرار دارد. ترتیب پردازندههای منطقی کمی نامتعارف است تا مثال بهتری از لیست شناسهها ارائه شود:
-
% erl +sct L0-1,3-2c0-3p0N0:L7,4,6-5c0-3p1N1 1> erlang:system_info(cpu_topology). [{node,[{processor,[{core,{logical,0}}, {core,{logical,1}}, {core,{logical,3}}, {core,{logical,2}}]}]}, {node,[{processor,[{core,{logical,7}}, {core,{logical,4}}, {core,{logical,6}}, {core,{logical,5}}]}]}]
تا زمانی که شناسههای واقعی صحیح باشند، اشکالی ندارد توپولوژی CPU ارائهشده توصیف دقیقی از سختافزار واقعی نباشد. این کار در صورت استفاده دقیق میتواند بسیار مفید واقع شود تا شبیهساز فریب خورده و زمانبندها را طبق تمایل شما مقید کند. برای نمونه، اگر میخواهید چندین سیستم زمان اجرای ارلنگ را روی یک ماشین اجرا کنید، میتوانید تعداد زمانبندها را کاهش داده و توپولوژی CPU را دستکاری کنید تا به CPUهای منطقی متفاوتی مقید شوند. یک مثال با دو سیستم زمان اجرای ارلنگ روی یک ماشین چهار هستهای:
-
% erl +sct L0-3c0-3 +sbt db +S3:2 -detached -noinput -noshell -sname one % erl +sct L3-0c0-3 +sbt db +S3:2 -detached -noinput -noshell -sname two
در این مثال، هر سیستم زمان اجرا دارای دو زمانبند آنلاین است و تمام زمانبندهای آنلاین روی هستههای متفاوتی اجرا خواهند شد. اگر این وضعیت را به یک زمانبند آنلاین در یک سیستم و سه زمانبند آنلاین در سیستم دیگر تغییر دهیم، باز هم تمام زمانبندهای آنلاین روی هستههای متفاوتی اجرا خواهند شد.
توجه داشته باشید که یک توپولوژی فرضی CPU که بیانگر توپولوژی واقعی نباشد، به احتمال زیاد کارایی سیستم زمان اجرا را کاهش میدهد.
برای اطلاعات بیشتر، به erlang:system_info(cpu_topology) مراجعه نمایید.
+ssrct
نکته: خواندن توپولوژی CPU زمان راهاندازی را هنگام اجرای نمونههای موازی متعدد از ERTS بر روی سیستمهای دارای تعداد هستههای زیاد کُند میکند؛ استفاده از این فلگ ممکن است در چنین سناریوهایی سرعت اجرا را افزایش دهد.
+sfwi Interval
نکته: این قابلیت به عنوان یک راهکار موقت برای کدهای بومی (native code) با اجرای طولانی و کدهای بومی که در OTP کاهشها (reductions) را به درستی افزایش نمیدهند ارائه شده است. پس از رفع این اشکالات، این فلگ حذف خواهد شد.
+spp Bool
+sss size
+sssdcpu size
+sssdio size
+stbt BindType
+sub true|false
گزینه +sub true تنها در سیستمهایی پشتیبانی میشود که سیستم زمان اجرا یک ساعت با وضوح بالا و یکنواخت افزایشی را شناسایی کرده و مورد استفاده قرار دهد. در سایر سیستمها، راهاندازی سیستم زمان اجرا با شکست مواجه میشود.
گزینه +sub true مستلزم +scl false است. تفاوت بین +sub true و +scl false این است که +scl false تلاشی برای متعادل کردن بهرهوری زمانبندها نمیکند.
+swct very_eager|eager|medium|lazy|very_lazy
نکته: این فلگ میتواند در هر زمان بدون اطلاع قبلی حذف یا تغییر یابد.
+sws default|legacy
نکته: این فلگ میتواند در هر زمان بدون اطلاع قبلی حذف یا تغییر یابد.
+swt very_low|low|medium|high|very_high
نکته: این فلگ میتواند در هر زمان بدون اطلاع قبلی حذف یا تغییر یابد.
+swtdcpu very_low|low|medium|high|very_high
نکته: این فلگ میتواند در هر زمان بدون اطلاع قبلی حذف یا تغییر یابد.
+swtdio very_low|low|medium|high|very_high
نکته: این فلگ میتواند در هر زمان بدون اطلاع قبلی حذف یا تغییر یابد.
+t size
+T Level
زمانبندی تغییریافته بر موارد زیر تأثیر میگذارد:
تولید فرآیند (Process spawning)
کاهشهای زمینه (Context reductions)
کاهشهای ورودی (Input reductions)
نکته: هنگام فعال بودن زمانبندی تغییریافته، کارایی سیستم کاهش مییابد. این فلگ صرفاً برای آزمایش و اشکالزدایی در نظر گرفته شده است. پیامهای ردیابی return_to و return_from هنگام ردیابی روی BIFهای spawn از دست میروند. این فلگ میتواند در هر زمان بدون اطلاع قبلی حذف یا تغییر یابد.
+v
+vs
DEBUG_SYSTEM، مشابه +v
DEBUG_PRIVATE_GC
DEBUG_MEMORY
DEBUG_ALLOCATION
DEBUG_THREADS
DEBUG_PROCESSES
DEBUG_MESSAGES
DEBUG_SHCOPY
این یک قابلیت اشکالزدایی erts است و در هر زمان میتواند بدون اطلاع قبلی تغییر کند.
+V
+W w | i | e
+zFlag Value
+zdbbl size
یک حد بافر بزرگتر به فرآیندها اجازه میدهد پیامهای خروجی بیشتری را روی شبکه توزیع بافر کنند. هنگامی که به حد بافر برسد، فرآیندهای ارسالکننده تا زمانی که اندازه بافر کوچکتر شود معلق میشوند. حد بافر به ازای هر کانال توزیع اعمال میشود. یک حد بالاتر تأخیر کمتر و توان عملیاتی بالاتری را به بهای مصرف حافظه بیشتر فراهم میسازد.
این محدودیت تنها بر فرآیندهایی تأثیر میگذارد که سیگنالدهی توزیعشده کاملاً ناهمگام (fully asynchronous distributed signaling) را غیرفعال کردهاند.
+zdntgc time
مدخلهای جدول گره که به آنها ارجاع داده نمیشود حداقل به اندازه مدت زمانی که این پارامتر تعیین میکند در جدول باقی میمانند. این ماندگاری از وقوع حذفها و درجهای مکرر در جدولها جلوگیری میکند.
+zosrl limit
+zhft limit
اگر تخلیه بافر در طول عملیات توقف به مدت <timeout> میلیثانیه ادامه داشته باشد، تخلیه قطع شده و سیستم زمان اجرا بلافاصله با کد خروج 255 خاتمه مییابد. در صورت توقف بدون تخلیه بافر، مقدار <timeout> هیچ اثری بر سیستم نخواهد داشت.
مقدار تعیینشده توسط این فلگ را میتوان در کد ارلنگ با فراخوانی erlang:system_info(halt_flush_timeout) خواند.
همچنین به گزینه flush_timeout از BIF مربوط به erlang:halt/2 مراجعه کنید. توجه داشته باشید که کوتاهترین زمان انقضا میان این آرگومان خط فرمان و گزینه flush_timeout، مقدار انقضای واقعی و نافذ خواهد بود.
از نسخه: OTP 27.0
متغیرهای محیطی (Environment Variables)
ERL_CRASH_DUMP
ERL_CRASH_DUMP_NICE
سیستمهای یونیکس: اگر شبیهساز نیاز به نوشتن گزارش خرابی داشته باشد، از مقدار این متغیر برای تنظیم مقدار nice فرآیند استفاده میکند و در نتیجه اولویت آن را کاهش میدهد. محدوده معتبر ۱ تا ۳۹ است (مقادیر بالاتر با ۳۹ جایگزین میشوند). بالاترین مقدار، ۳۹، کمترین اولویت را به فرآیند اختصاص میدهد.
ERL_CRASH_DUMP_SECONDS
سیستمهای یونیکس: این متغیر تعداد ثانیههایی را مشخص میکند که شبیهساز مجاز است صرف نوشتن گزارش خرابی کند. هنگامی که تعداد ثانیههای مشخصشده سپری شد، شبیهساز خاتمه مییابد. ERL_CRASH_DUMP_SECONDS=0
ERL_CRASH_DUMP_SECONDS=S
ERL_CRASH_DUMP_SECONDS=-1
همچنین به heart مراجعه کنید.
ERL_CRASH_DUMP_BYTES
معرفیشده در ERTS 8.1.2 (Erlang/OTP 19.2).
ERL_CRASH_DUMP_PUBLIC_KEY
هنگامی که شبیهساز برای تولید گزارشهای خرابی رمزگذاریشده ساخته شده باشد، در صورتی که این مورد به درستی پیکربندی نشده باشد از راهاندازی خودداری میکند، زیرا هنگام خرابی شبیهساز برای رسیدگی به هرگونه مشکل احتمالی بسیار دیر خواهد بود.
تحت این طرح رمزگذاری، شبیهساز تنها نحوه رمزگذاری گزارش خرابی را میداند. برای رمزگشایی گزارش خرابی، باید ماژول crashdump همراه با کلید خصوصی استفاده شود، و باید دقت شود که کلید خصوصی روی سیستم هدف ذخیره نگردد.
انواع کلیدهای پشتیبانیشده شامل RSA با ۲۰۴۸ بیت یا بالاتر، و همچنین ML-KEM در صورت پشتیبانی در OpenSSL نصبشده شما هستند.
معرفیشده در ERTS 16.3 (Erlang/OTP 29).
ERL_AFLAGS
با فلگ -extra به شیوه خاصی رفتار میشود. دامنه آن در پایان محتوای متغیر محیطی خاتمه مییابد. آرگومانهای پس از فلگ -extra در خط فرمان به بخش -extra، یعنی انتهای خط فرمان پس از فلگ -extra منتقل میشوند.
ERL_ZFLAGS and ERL_FLAGS
با فلگ -extra به شیوه خاصی رفتار میشود. دامنه آن در انتهای محتوای متغیر محیطی خاتمه مییابد. آرگومانهای پس از یک فلگ -extra در خط فرمان به بخش -extra، یعنی انتهای خط فرمان پس از فلگ -extra منتقل میشوند.
ERL_LIBS
ERL_EPMD_ADDRESS
ERL_EPMD_PORT
سیگنالها (Signals)
در سیستمهای یونیکس، سیستم زمان اجرای ارلنگ دو نوع سیگنال را تفسیر میکند.
SIGUSR1
SIGTERM
معرفیشده در ERTS 8.3 (Erlang/OTP 19.3)
سیگنال SIGUSR2 برای مصارف داخلی رزرو شده است. هیچ سیگنال دیگری رسیدگی نمیشود.
پیکربندی (Configuration)
سیستم استاندارد Erlang/OTP میتواند برای تغییر رفتار پیشفرض هنگام راهاندازی دوباره پیکربندی شود.
فایل راهاندازی .erlang
اگر یک فایل .erlang یافت شود، فرض بر این است که حاوی عبارات معتبر ارلنگ است. این عبارات طوری ارزیابی میشوند که گویی به عنوان ورودی به شل داده شدهاند.
یک فایل معمولی .erlang شامل مجموعهای از مسیرهای جستجو است، برای مثال:
-
io:format("executing user profile in $HOME/.erlang\n",[]). code:add_path("/home/calvin/test/ebin"). code:add_path("/home/hobbes/bigappl-1.2/ebin"). io:format(".erlang rc finished\n",[]).
برای گنجاندن دستورات شل خصوصی، آنها را در یک ماژول user_default تعریف کرده و آرگومان زیر را به عنوان خط اول در فایل .erlang بیفزایید:
-
code:load_abs("..../user_default").
erl
همچنین ببینید (See Also)
epmd(1), erl_prim_loader, erts_alloc(3), init, application, auth, code, erl_boot_server, heart, net_kernel, make
| erts 17.0.6 | Ericsson AB |