Go to main content
リソース管理および Oracle® Solaris ゾーン開発者ガイド

印刷ビューの終了

更新: 2016 年 11 月
 
 

リソースプールのコード例

このセクションでは、リソースプールインタフェースのコード例を示します。

リソースプール内の CPU 数の確認

sysconf(3C) は、システム全体の CPU 数に関する情報を提供します。次の例は、特定のアプリケーションのプール pset に定義された CPU 数の確認の粒度を示しています。

この例の重要なポイントは次のとおりです。

  • pvals[] は NULL 終端配列になります。

  • pool_query_pool_resources() は、アプリケーションのプール my_pool から pvals 配列型 pset に一致するすべてのリソースのリストを返します。プールは pset リソースのインスタンスを 1 つしか持てないため、各インスタンスは常に nelem で返されます。reslist[] には、唯一の要素である pset リソースが含まれます。

pool_value_t *pvals[2] = {NULL};  /* pvals[] should be NULL terminated */

/* NOTE: Return value checking/error processing omitted */
/* in all examples for brevity */

conf_loc = pool_dynamic_location();
conf = pool_conf_alloc();
pool_conf_open(conf, conf_loc, PO_RDONLY);
my_pool_name = pool_get_binding(getpid());
my_pool = pool_get_pool(conf, my_pool_name);
pvals[0] = pool_value_alloc();
pvals2[2] = { NULL, NULL };
pool_value_set_name(pvals[0], "type");
pool_value_set_string(pvals[0], "pset");

reslist = pool_query_pool_resources(conf, my_pool, &nelem, pvals);
pool_value_free(pvals[0]);
pool_query_resource_components(conf, reslist[0], &nelem, NULL);
printf("pool %s: %u cpu", my_pool_ name, nelem);
pool_conf_close(conf);

すべてのリソースプールの表示

次の例では、アプリケーションのプール pset 内で定義されているすべてのリソースプールが一覧表示されています。

この例の重要なポイントは次のとおりです。

  • 動的 conf ファイルを読み取り専用の PO_RDONLY で開きます。pool_query_pools()pl のプールのリストおよび nelem のプール数を返します。要素から pval 値に pool.name プロパティーを取得するには、各プールに対して pool_get_property() を呼び出します。

  • pool_get_property()pool_to_elem() を呼び出して libpool エンティティーを不透明な値に変換します。pool_value_get_string() は不透明なプール値から文字列を取得します。

conf	= pool_conf_alloc();
pool_conf_open(conf, pool_dynamic_location(), PO_RDONLY);
pl = pool_query_pools(conf, &nelem, NULL);
pval = pool_value_alloc();
for (i = 0; i < nelem; i++) {
    pool_get_property(conf, pool_to_elem(conf, pl[i]), "pool.name", pval);
    pool_value_get_string(pval, &fname);
    printf("%s\n", name);
}
pool_value_free(pval);
free(pl);
pool_conf_close(conf);

指定されたプールのプール統計の報告

次の例は、指定されたプールの統計を報告しています。

この例の重要なポイントは次のとおりです。

  • pool_query_pool_resources() は、rl のすべてのリソースのリストを取得します。pool_query_pool_resources() の最後の引数が NULL のため、すべてのリソースが返されます。各リソースについて、nameload、および size プロパティーが読み取られ、出力されます。

  • strdup() への呼び出しは、ローカルメモリーを割り当て、get_string() によって返される文字列をコピーします。get_string() への呼び出しは、get_property() への次の呼び出しによって解放されるポインタを返します。strdup() への呼び出しが含まれていない場合、文字列を次に参照した際に、セグメンテーション違反によってアプリケーションにエラーが発生する可能性があります。

printf("pool %s\n:" pool_name);
pool = pool_get_pool(conf, pool_name);
rl = pool_query_pool_resources(conf, pool, &nelem, NULL);
for (i = 0; i < nelem; i++) {
  pool_get_property(conf, pool_resource_to_elem(conf, rl[i]), "type", pval);
  pool_value_get_string(pval, &type);
  type = strdup(type);
  snprintf(prop_name, 32, "%s.%s", type, "name");
  pool_get_property(conf, pool_resource_to_elem(conf, rl[i]), 
        prop_name, pval);
  pool_value_get_string(val, &res_name);
  res_name = strdup(res_name);
  snprintf(prop_name, 32, "%s.%s", type, "load");
  pool_get_property(conf, pool_resource_to_elem(conf, rl[i]), 
        prop_name, pval);
  pool_value_get_uint64(val, &load);
  snprintf(prop_name, 32, "%s.%s", type, "size");
  pool_get_property(conf, pool_resource_to_elem(conf, rl[i]), 
        prop_name, pval);
  pool_value_get_uint64(val, &size);
  printf("resource %s: size %llu load %llu\n", res_name, size, load);
  free(type);
  free(res_name);
}
free(rl);

pool.comment プロパティーの設定と新規プロパティーの追加

次の例では、psetpool.comment プロパティーを設定します。また、この例では pool.newprop に新規プロパティーも作成します。

この例の重要なポイントは次のとおりです。

  • 静的構成ファイルで PO_RDWR を使用して pool_conf_open() への呼び出しを行う場合は、呼び出し元のが root である必要があります。

  • このユーティリティーの実行後にこれらの変更を pset にコミットするには、pooladm -c コマンドを発行します。ユーティリティーに変更をコミットさせるには、ゼロ以外の第 2 引数を指定して pool_conf_commit() を呼び出します。

pool_set_comment(const char *pool_name, const char *comment)
{
  pool_t *pool;
  pool_elem_t *pool_elem;
  pool_value_t *pval = pool_value_alloc(); 
  pool_conf_t  *conf = pool_conf_alloc();
  /* NOTE: need to be root to use PO_RDWR on static configuration file */
  pool_conf_open(conf, pool_static_location(), PO_RDWR);
  pool = pool_get_pool(conf,  pool_name);
  pool_value_set_string(pval, comment);
  pool_elem = pool_to_elem(conf, pool);
  pool_put_property(conf, pool_elem, "pool.comment", pval);
  printf("pool %s: pool.comment set to %s\n:" pool_name, comment);
  /* Now, create a new property, customized to installation site */
  pool_value_set_string(pval, "New String Property");
  pool_put_property(conf, pool_elem, "pool.newprop", pval);
  pool_conf_commit(conf, 0); /* NOTE: use 0 to ensure only */
                             /* static file gets updated */
  pool_value_free(pval);
  pool_conf_close(conf);
  pool_conf_free(conf);
  /* NOTE: Use "pooladm -c" later, or pool_conf_commit(conf, 1) */
  /* above for changes to the running system */
}

プールのコメントを変更して新規プールプロパティーを追加するもう 1 つの方法は、poolcfg(1M) を使用する方法です。

poolcfg -c 'modify pool pool-name (string pool.comment = "cmt-string")'
poolcfg -c 'modify pool pool-name (string pool.newprop = 
                                   "New String Property")'