PostgreSQLをチューニングする機会があったので
その時に調べたチューニング項目を備忘録として残しておきます。
バージョンの違いやサーバの規模などによっても
効果は変わってくると思うのであくまで参考程度のものですが。
・shared_buffers
7系では8000〜10000程度まで引き上げる
8系では150000程度まで引き上げることが可能、100000程度が性能のピーク
これに多く割り当てるよりOSのバッファ領域として使う方が性能が向上する
テーブルサイズを割り出して設定するのがベスト
簡単に設定するなら搭載メモリ量の1/4、搭載メモリが多ければ1/2ぐらいでも可
・max_connections
7系では256程度、8系では1000程度が性能のピーク
・work_mem(sort_mem)
適切なサイズに調整する、2048〜4096程度
プロセス毎に領域が割り当てられるので多すぎるとスワップする可能性も
ソートメモリはORDER BYだけではなくMerge Join、CREATE INDEX時でも使用される
・deadlock_timeout
長めに設定する
1000ms×同時セッション数が理想
・effective_cache_size
数GBメモリ積んだマシンなら総メモリの1/4〜1/2を設定
・wal_buffers
トランザクションが多い、大きい場合に多く取っておくと書き込み効率が良くなる。32〜64程度。
・commit_delay
同時トランザクション数が多い場合、0以上を設定すると書き込み効率が上がる
・random_page_count
余程巨大なテーブルが無い限り数GBのメモリのマシンなら2〜3が適当
・max_fsm_pages
小さすぎるとクラスタ容量が増えすぎる、大きすぎると検索オーバーヘッドが大きくなる、vacuum -vの情報を見て調節
・bgwriter_maxpages
参照系DBなら値を小さく、トランザクションが多いDBなら大きく設定する
・checkpoint_segments
大きく設定するとハードディスクへの書き込み頻度が減り性能が向上する
・VACUUM FULLをしてもインデックスの領域は切り詰められないのでREINDEXを行い無駄な領域を削除する
・複数のハードディスク上のテーブルスペースにテーブルを作ることによりIOが分散し効率が良くなる
・walログも別ハードディスクに移すと結構IO効率が上がる
・fstabのマウント情報にnoatimeを指定し、atimeの更新を抑えると若干性能アップ
2007/07/12
PHPでUTF-8の文字数をShift-jisの文字数にてカウントする方法
$str = "12345あいうえお12345";
$str = mb_convert_encoding($str, "shift-jis", "UTF-8");
$str = mb_strcut($str, 0, 10, "shift-jis");
$str = mb_convert_encoding($str, "UTF-8", "shift-jis");
echo($str);
?>
$str = mb_convert_encoding($str, "shift-jis", "UTF-8");
$str = mb_strcut($str, 0, 10, "shift-jis");
$str = mb_convert_encoding($str, "UTF-8", "shift-jis");
echo($str);
?>
2007/06/27
CIのはまりどころ_クッキーヘルパーにて
以下のようにしないと第2引数までしか指定しない場合に有効期限がセットした日から30日前になってしまいます。
function set_cookie($name = '', $value = '', $expire = '', $domain = '', $path = '/', $prefix = '')
{
if (is_array($name))
{
foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'name') as $item)
{
if (isset($name[$item]))
{
$$item = $name[$item];
}
}
}
// Set the config file options
$CI =& get_instance();
if ($prefix == '' AND $CI->config->item('cookie_prefix') != '')
{
$CI->config->item('cookie_prefix');
}
if ($domain == '' AND $CI->config->item('cookie_domain') != '')
{
$CI->config->item('cookie_domain');
}
if ($prefix == '/' AND $CI->config->item('cookie_path') != '/')
{
$CI->config->item('cookie_path');
}
if ( ! is_numeric($expire))
{
$expire = time() + 86500;
// $expire = time() - 86500; //<-これバグでないの?
}
else
{
if ($expire > 0)
{
$expire = time() + $expire;
}
else
{
$expire = 0;
}
}
setcookie($prefix.$name, $value, $expire, $path, $domain, 0);
}
function set_cookie($name = '', $value = '', $expire = '', $domain = '', $path = '/', $prefix = '')
{
if (is_array($name))
{
foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'name') as $item)
{
if (isset($name[$item]))
{
$$item = $name[$item];
}
}
}
// Set the config file options
$CI =& get_instance();
if ($prefix == '' AND $CI->config->item('cookie_prefix') != '')
{
$CI->config->item('cookie_prefix');
}
if ($domain == '' AND $CI->config->item('cookie_domain') != '')
{
$CI->config->item('cookie_domain');
}
if ($prefix == '/' AND $CI->config->item('cookie_path') != '/')
{
$CI->config->item('cookie_path');
}
if ( ! is_numeric($expire))
{
$expire = time() + 86500;
// $expire = time() - 86500; //<-これバグでないの?
}
else
{
if ($expire > 0)
{
$expire = time() + $expire;
}
else
{
$expire = 0;
}
}
setcookie($prefix.$name, $value, $expire, $path, $domain, 0);
}
2007/06/22
AjaxのresponseXMLにてはまる
IE6とFF2ではネームスペースの対応が違う。
たとえば以下ようなXMLがあったとき。
xsd:a xmlns:xsd="http:/sample.com/xsd"
xsd:bこれはテスト
たとえば以下ようなXMLがあったとき。
xsd:a xmlns:xsd="http:/sample.com/xsd"
xsd:bこれはテスト