PMGENMAP(1) General Commands Manual PMGENMAP(1)

pmgenmap - تولید کد C برای ساده‌سازی مدیریت معیارهای کارایی

pmgenmap [infile]

با دریافت یک یا چند فهرست از نام‌های معیار در infile یا در ورودی استاندارد، pmgenmap اعلان‌های C و ماکروهای cpp(1) مناسب برای استفاده در «رابط برنامه‌نویسی معیارهای کارایی» (PMAPI) را در خروجی استاندارد تولید می‌کند.

اعلان‌های تولیدشده توسط pmgenmap کدنویسی برنامه‌های کارخواهی را که از PMAPI استفاده می‌کنند ساده می‌سازد.

ورودی باید شامل یک یا چند فهرست از نام‌های معیار به شکل زیر باشد:

listname {
    metricname1 symbolname1
    metricname2 symbolname2
    ...
}

که اعلان‌های C و cpp(1) را به شکل زیر تولید خواهد کرد:

char *listname[] = {
#define symbolname1 0
    "metricname1",
#define symbolname2 1
    "metricname2",
    ...
};

اعلان‌های آرایه‌ایِ تولیدشده به‌عنوان آرگومان برای pmLookupName(3) مناسب هستند، و از ثابت‌های تعریف‌شده با #define می‌توان برای نمایه‌گذاری vset ها در ساختار pmResult که توسط فراخوانی pmFetch(3) بازگردانده می‌شود، استفاده کرد.

بدیهی است که listname باید با قواعد نام‌گذاری شناسه‌ها در C مطابقت داشته باشد، هر symbolname باید از قواعد نام‌گذاری ماکروهای cpp(1) پیروی کند، و انتظار می‌رود هر metricname یک نام معتبر برای معیارهای کارایی باشد (برای جزئیات بیشتر به PMNS(5) مراجعه کنید).

ورودی ممکن است شامل خطوط توضیح به سبک sh باشد، یعنی خطوطی که در آن‌ها نخستین نویسهٔ غیرفاصله یک «#» است؛ این خطوط در خروجی به توضیحات تک‌خطی یا چندخطی C به سبک K&R تبدیل می‌شوند. برای نمونه، ورودی:

# leading block of multi-line comments
# initialization group
foo {
        a.b.c   ONE
        d.e.f.g TWO
        # embedded block of multi-lines
        # comments and boring pad text
        xx.yy.zz        THREE
}
# trailing single line comment

خروجی زیر را تولید می‌کند:

/*
 * leading block of multi-line comments
 * initialization group
 */
char *foo[] = {
#define ONE 0
        "a.b.c",
#define TWO 1
        "d.e.f.g",
/*
 * embedded block of multi-lines
 * comments and boring pad text
 */
#define THREE 2
        "xx.yy.zz",
};
/* trailing single line comment */

برای رعایت اختصار، کد مدیریت خطا حذف شده است و فرض شده معیارهای انتخاب‌شده دارای چندین مقدار نیستند.

فایل ورودی

mystats {
    kernel.percpu.cpu.idle     IDLE
    kernel.percpu.cpu.sys      SYS
    kernel.percpu.cpu.user     USER
    hinv.ncpu                       NCPU
}

کد C زیر را تولید می‌کند که برای #include کردن مناسب است:

/*
 * Performance Metrics Name Space Map
 * Built by pmgenmap from the file
 * mystats.metrics
 * on Wed Dec 28 19:44:17 EST 1994
 *
 * Do not edit this file!
 */
char *mystats[] = {
#define IDLE    0
        "kernel.percpu.cpu.idle",
#define SYS     1
        "kernel.percpu.cpu.sys",
#define USER    2
        "kernel.percpu.cpu.user",
#define NCPU    3
        "hinv.ncpu",
};

با استفاده از کد تولیدشده توسط pmgenmap، اکنون می‌توانیم به شکل زیر به‌سادگی معیارهایی را از «زیرسیستم جمع‌آوری معیارهای کارایی» (PMCS) به دست آوریم:

#define MAX_PMID 4
    int         trip = 0;
    int         numpmid = sizeof(mystats)/sizeof(mystats[0]);
    double      duration;
    pmResult    *resp;
    pmResult    *prev;
    pmID        pmidlist[MAX_PMID];
    pmNewContext(PM_CONTEXT_HOST, "localhost");
    pmLookupName(numpmid, mystats, pmidlist);
    pmFetch(numpmid, pmidlist, &resp);
    printf("%d CPUs: %d usr   %d sys   %d   idle0,
           resp->vset[NCPU]->vlist[0].value.lval,
           resp->vset[USER]->vlist[0].value.lval,
           resp->vset[SYS]->vlist[0].value.lval,
           resp->vset[IDLE]->vlist[0].value.lval);

برخی از فراخوانی‌ها برای اطمینان از قابلیت حمل، جهت وضوح بیشتر از کد بالا حذف شده‌اند - مثال بالا نباید به‌عنوان الگویی برای برنامه‌نویسی استفاده شود. به‌ویژه، مقادیر خام معیارها در حالی استفاده شده‌اند که برای تعیین معناشناسی هر معیار باید pmLookupDesc(3) فراخوانی می‌شد.

مثال‌های کامل‌تری که نحوهٔ استفاده از pmgenmap را نشان می‌دهند و می‌توانند به‌عنوان پایه‌ای برای توسعهٔ برنامه‌ها به کار روند، در برنامه‌های نمایشی PCP گنجانده شده‌اند؛ مانند $PCP_DEMOS_DIR/pmclient.

$PCP_VAR_DIR/pmns/*
فایل‌های مشخصات پیش‌فرض PMNS

متغیرهای محیطی با پیشوند PCP_ برای پارامتریک‌سازی نام فایل‌ها و دایرکتوری‌های مورداستفادهٔ PCP به کار می‌روند. در هر نصب، فایل /etc/pcp.conf حاوی مقادیر محلی برای این متغیرها است. همان‌طور که در pcp.conf(5) شرح داده شده است، متغیر $PCP_CONF می‌تواند برای مشخص کردن یک فایل پیکربندی جایگزین استفاده شود.

cpp(1)، PMAPI(3)، pmFetch(3)، pmLookupName(3)، pmNewContext(3)، pcp.conf(5)، pcp.env(5) و PMNS(5).

PCP Performance Co-Pilot