-->

2013-08-30

PORTDIR_OVERLAYの追加 part4

参考URL.
https://devmanual.gentoo.org/general-concepts/dependencies/index.html

http://www.gentoo.org/doc/ja/policy.xml

http://www.atzm.org/gentoo/ebuilds2.html

http://insnvlovn.blogspot.jp/2013/08/memo-hhvm.html

hhvmの依存パッケージをemerge --depcleanで消したくない。
# /var/lib/portage/world(emerge --oneshot => emerge --noreplace)登録では
# 後で何でインストールした?となることがある。
# 全部libevent-1.4.14b-stableみたいにソースから入れれば良かったのでは?
$ /usr/local/hhvm/2013-08-11/hiphop-php/hphp/hhvm/hhvm --version
HipHop VM v2.1.0-dev (rel)
Compiler: heads/master-0-g67ec381c907f1cb0c20fd7ae39bac594cce5260f
Repo schema: c1d8348ed4576c1d8bea8d67f007c715860f7c6d

そんな時はvirtualパッケージを登録する。
# もっと楽にできたような気がする。コマンド的な何かで一発登録。
$ grep /usr/local/portage/test /etc/portage/make.conf
PORTDIR_OVERLAY="${PORTDIR_OVERLAY} /usr/local/portage/test"

mkdir -p /usr/local/portage/test/virtual/hhvm
cd /usr/local/portage/test/virtual/hhvm
cp -i /usr/portage/virtual/acl/acl-0-r1.ebuild hhvm-2.1.0.ebuild

RDEPENDだけ修正する。
# ={$packagename}-{$version} でバージョン固定で依存("="のかわりに"~"で-r1とかOK.)
# {$packagename}[useflag1,useflag2] で依存パッケージにuseflagを要求。
# もっと細かく指定可能なのでマニュアルを閲覧する。
# 個人の用途であれば説明とか修正しなくても動く。
# たまたま元から入っていた依存パッケージもあるので、それも書かないと後で動作しなくなる。
# バージョン書いてないのにもバージョン指定があったような気がした。インストール時のエラーメッセージで。
$ cat hhvm-2.1.0.ebuild
# Copyright 1999-2013 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/virtual/acl/acl-0-r1.ebuild,v 1.3 2013/03/22 16:03:21 jer Exp $

EAPI="3"

DESCRIPTION="Virtual for acl support (sys/acl.h)"
HOMEPAGE=""
SRC_URI=""

LICENSE=""
SLOT="0"
KEYWORDS="alpha amd64 arm hppa ia64 m68k ~mips ppc ppc64 s390 sh sparc x86 ~amd64-fbsd ~x86-fbsd ~amd64-linux ~ia64-linux ~x86-linux"
IUSE=""

DEPEND=""
RDEPEND="
dev-libs/boost
dev-cpp/glog[unwind]
=dev-libs/libmemcached-0.39
media-libs/gd[jpeg,png]
dev-cpp/tbb
net-nds/openldap
=dev-libs/libdwarf-20120410
net-libs/c-client
"

インストールする。
ebuild hhvm-2.1.0.ebuild manifest
sudo emerge -avt hhvm

確認する。
$ grep hhvm /var/lib/portage/world
virtual/hhvm

チェックする。
逆にuseflagがあってはいけない、と変更する。
...
dev-cpp/glog[-unwind]
...

インストールはしないが、どうなるか確認する。
$ ebuild hhvm-2.1.0.ebuild manifest
$ sudo emerge -avtp hhvm

The following USE changes are necessary to proceed:
 (see "package.use" in the portage(5) man page for more details)
# required by virtual/hhvm-2.1.0::x-test
# required by hhvm (argument)
>=dev-cpp/glog-0.3.3 -unwind

These are the packages that would be merged, in reverse order:

Calculating dependencies  ... done!
[ebuild   R    ] virtual/hhvm-2.1.0::x-test  0 kB
[ebuild   R    ]  dev-cpp/glog-0.3.3  USE="-gflags -static-libs {-test} -unwind*" 0 kB

Total: 2 packages (2 reinstalls), Size of downloads: 0 kB

戻す。
$ grep unwind hhvm-2.1.0.ebuild
dev-cpp/glog[unwind]
$ ebuild hhvm-2.1.0.ebuild manifest

$ sudo emerge -avtp hhvm

These are the packages that would be merged, in reverse order:

Calculating dependencies  .... done!
[ebuild   R    ] virtual/hhvm-2.1.0::x-test  0 kB

Total: 1 package (1 reinstall), Size of downloads: 0 kB

2013-08-29

memo

http://news.mynavi.jp/articles/2009/01/27/perftools/003.html

http://goog-perftools.sourceforge.net/doc/tcmalloc.html

http://www.ibm.com/developerworks/jp/opensource/library/os-php-v521/

http://www.checksite.jp/jmxterm-command-line-tool/

$ rcsdiff -r1.1 /etc/config-archive/etc/tomcat-7-7.0.42-main/server.xml,v /etc/tomcat-7-7.0.42-main/server.xml
===================================================================
RCS file: /etc/config-archive/etc/tomcat-7-7.0.42-main/server.xml,v
retrieving revision 1.1
diff -r1.1 /etc/tomcat-7-7.0.42-main/server.xml
27c27
<   <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
---
>   <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
71a72,74
>                acceptCount="65536"
>                maxConnections="-1"
>                maxThreads="2000"
91c94
<     <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
---
>     <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->

2013-08-28

memo: DBCP

http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html

http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html#Database_Connection_Pool_%28DBCP%29_Configurations

http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html#Database_Connection_Pool_%28DBCP%29_Configurations

http://www.atmarkit.co.jp/ait/articles/1111/07/news212.html

警告: Failed to register in JMX: javax.naming.NamingException: Could not create resource factory instance [Root exception is java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory]

$ tar xvzf /usr/portage/distfiles/commons-dbcp-1.4-src.tar.gz
$ cd commons-dbcp-1.4-src/
$ grep -nri BasicDataSourceFactory .
...
$ grep -nriP "org\..*\.BasicDataSourceFactory" .
./xdocs/release-notes-1.2.1.xml:42:     at org.apache.commons.dbcp.BasicDataSourceFactory.createDataSource(BasicDataSourceFactory.java:162)
./xdocs/release-notes-1.2.1.xml:43:     at org.apache.commons.dbcp.BasicDataSourceFactory.getObjectInstance(BasicDataSourceFactory.java:144)
./xdocs/guide/jndi-howto.xml:57:    "org.apache.commons.dbcp.BasicDataSourceFactory", null);

$ grep -A24 "jdbc/TestDB" ./conf/Catalina/localhost/test001.xml > tmp1.txt
$ grep -A24 "jdbc/DbcpTestDB" ./conf/Catalina/localhost/test001.xml > tmp2.txt
$ diff tmp{1,2}.txt
1c1
<   <Resource name="jdbc/TestDB"
---
>   <Resource name="jdbc/DbcpTestDB"
4c4
<             factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
---
>             factory="org.apache.commons.dbcp.BasicDataSourceFactory"

$ rcsdiff /etc/config-archive/etc/conf.d/tomcat-7-7.0.42-main,v /etc/conf.d/tomcat-7-7.0.42-main
===================================================================
RCS file: /etc/config-archive/etc/conf.d/tomcat-7-7.0.42-main,v
retrieving revision 1.2
diff -r1.2 /etc/conf.d/tomcat-7-7.0.42-main
19c19
< TOMCAT_EXTRA_JARS="jdbc-mysql"
---
> TOMCAT_EXTRA_JARS="jdbc-mysql,commons-pool,commons-collections,commons-dbcp"

2013-08-26

ab と gnuplot の例

ファイルサイズ。(サンプル結果含む)
466M    gnuplot.2013-08-25_230027/
13M     gnuplot.2013-08-25_230027.tar.bz2

使用法。レスポンスのbodyが同じURLを用意します。
$ grep -A6 -n "\$urlList =" make.php
111:    $urlList = array(
112-        "apache-worker_mod-php" => "http://192.168.0.110/test/gnuplot/test001.php",
113-        "pecl-event_php-cli" => "http://192.168.0.110:8010/",
114-        "tomcat" => "http://192.168.0.110:8080/test001/hello",
115-        "nodejs" => "http://192.168.0.110:8124/",
116-        "pecl-libevent_php-cli" => "http://192.168.0.110:2000/",
117-        );

phpコマンドを用意します。
$ php -v
PHP 5.4.17-pl0-gentoo (cli) (built: Aug 16 2013 22:08:43)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

必要があればフォントを用意します。もしくは変更かコメントアウトします。
$ grep -n "putenv" make.php
10:putenv("PATH=/usr/bin:/bin:/usr/sbin");
300:        putenv("GDFONTPATH=/usr/share/fonts/mplus-outline-fonts/");
301:        putenv("GNUPLOT_DEFAULT_GDFONT=M+2P+IPAG");

実行します。
N=10000 && for C in 5 15 45; do php make.php $N $C; done &

サンプルの結果ではpecl-eventが有利です。
しかしwebサーバとabとブラウザなどの色々な動作が一緒に動いているサーバの状態なので参考です。
なおEventHttp::setCallbackはメモリリークするようです。setDefaultCallbackで代用可能ですが。

gnuplotの設定はデータからグラフ表示だけする場合は複雑ではないです。
日本語も試したら使えました。
データは TIMESTAMP, data1, [data2 ...] のように2種類以上のデータであればグラフっぽくできます。

例えばsiegeがurllistとlogfileがあるようなので、複数のurlを指定する場合ab以外のほうが良いです。

ソースはhttp://www.php.net/manual/en/event.examples.phpのExample #8 Simple HTTP server です。

pecl-libeventのほうはstream_socket_serverのbacklogが128固定なのが関係が深いかもしれません。
ソースはhttps://gist.github.com/joseph-montanez/1122992です。
http://php.net/manual/en/libevent.examples.phpのServer example:です。

nodejsはhttp://nodejs.org/api/synopsis.htmlです。
apache(mod_php)とtomcatはprintを実行するだけのソースです。

https://docs.google.com/file/d/0BwK7sPpG0c5Zbjh6ZjhXenhxanM/edit?usp=sharing



参考URL.
http://blog.tojiru.net/category/10170146-4.html

http://blog.tojiru.net/article/225226976.html#more

http://tech.camobile.com/httpd/centos6-2-%E3%81%AB-g-wan-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%82%88/2036

http://stackoverflow.com/questions/5929104/apache-bench-gnuplot-output-what-are-the-column-definitions

http://stackoverflow.com/questions/937627/how-to-redirect-stdout-to-a-file-in-php

http://folk.uio.no/hpl/scripting/doc/gnuplot/Kawano/plot2.html

http://dsl4.eee.u-ryukyu.ac.jp/DOCS/gnuplot/node162.html

http://www.kusastro.kyoto-u.ac.jp/~moritani/etc/memo/gnuplot_memo.html

http://www.obihiro.ac.jp/~suzukim/masuda/utils/gnuplot.html

http://satococoa.github.io/blog/2012/10/25/performance-test-with-httperf/

http://memo.yomukaku.net/entries/394J1JB

http://higelog.brassworks.jp/?p=562

http://www5a.biglobe.ne.jp/~nkgwtty/nn_gnuplot.html

http://www.ss.scphys.kyoto-u.ac.jp/person/yonezawa/contents/program/gnuplot/label.html

http://squeeze.jp/blog/web-design/heading-design-css-only/

http://www.gnuplot-cmd.com/chart/label.html

http://d.hatena.ne.jp/ks88/20100110/1263127086

http://d.hatena.ne.jp/UDONCHAN/20101116/1289891757

http://www.netplan.co.jp/archives/1559

http://dsl4.eee.u-ryukyu.ac.jp/DOCS/gnuplot/node82.html

http://www.deqnotes.net/gnuplot/labels

http://d.hatena.ne.jp/sobasobasoba/20091212/1260613135

http://nemf.info/2011/07/how-to-make-a-graph-from-vmstat-by-gnuplot/

2013-08-25

memo: sort

id    uptm   data
...   ...    ...

-k2,2r -k1,1        => ORDER BY uptm DESC, id ASC
-k2,2r -k1          => ORDER BY uptm DESC, id ASC, data ASC
-k3,3r -k2,2r -k1,1 => ORDER BY data DESC, uptm DESC, id ASC

-k1                 => ORDER BY id ASC, uptm ASC, data ASC
-k1 -k3r            => ORDER BY id ASC, uptm ASC, data ASC
-k1,1 -k3,3r        => ORDER BY id ASC, data DESC
"-k1,1" "-k1,1r" のようにXX個目のカラムだけを正順、逆順、という風に書かないと、逆に難しい。



以下は詳細です。

定期的にsortがおかしい、なぜだ?と考えるのでメモを取る。
その都度納得しているような気がするが、なぜ納得したのか覚えていない。

元データ。
$ (echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0")
A z 0
B x 1
A y 1
B z 0

1カラム目~3カラム目までソートしてから、3カラム目でソートしている。
# 3カラム目のソートは2カラム目でソート済みなので無意味?
# 3カラム目はソート済み、という情報が記録されて何回も同じカラムでソートできない?
$ (echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k1 -k3
A y 1
A z 0
B x 1
B z 0

1カラム目でソートしてから、3カラム目でソートしている。
$ (echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k1,1 -k3,3
A z 0
A y 1
B z 0
B x 1

レコードを1つ増やす。
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0")
B z 1
A z 0
B x 1
A y 1
B z 0

1カラム目~3カラム目でソートしてから、3カラム目でソートする。(成功?)
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k1 -k3
A y 1
A z 0
B x 1
B z 0
B z 1

1カラム目~3カラム目でソートしてから、3カラム目で逆順ソートする。(失敗)
# 最後の2行が入れ替わることを期待した。
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k1 -k3r
A y 1
A z 0
B x 1
B z 0
B z 1

1カラム目~2カラム目でソートしてから、3カラム目で逆順ソートする。(成功)
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k1,2 -k3r
A y 1
A z 0
B x 1
B z 1
B z 0

1カラム目で逆順にソートする。(成功)
# 元の順序は保証されず、指定した1カラム目だけで見た場合は成功。
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k1,1r
B x 1
B z 0
B z 1
A y 1
A z 0

1カラム目で逆順にソートしたが、やっぱり正順にしよう。(失敗)
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k1,1r -k1,1
B x 1
B z 0
B z 1
A y 1
A z 0

2カラム目~3カラム目でソートしてから、1カラム目~3カラム目でソート(多分1カラム目のみ有効)する。
# ODER BY 2カラム目 ASC、3カラム目 ASC、1カラム目 ASC、なイメージ。
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k2 -k1
B x 1
A y 1
A z 0
B z 0
B z 1

2カラム目~3カラム目でソートしてから、1カラム目~3カラム目で逆順ソート(多分1カラム目のみ有効)する。
# 1カラム目の最後3つ, B,A,B は、3カラム目の最後3つ, 0,0,1 のほうが優先なので、おかしくない。
# ODER BY 2カラム目 ASC、3カラム目 ASC、1カラム目 DESC、なイメージ。
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k2 -k1r
B x 1
A y 1
B z 0
A z 0
B z 1

2カラム目でソートしてから、1カラム目~3カラム目で逆順にソート(1カラム目、3カラム目の順にソート)する。
# ODER BY 2カラム目 ASC、1カラム目 DESC、3カラム目 DESC、なイメージ。
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k2,2 -k1r
B x 1
A y 1
B z 1
B z 0
A z 0

2カラム目でソートしてから、1カラム目で逆順にソートする。
# ODER BY 2カラム目 ASC、1カラム目 DESC、なイメージ。
# B z 0
# B z 1 <= ここら辺の順番は確定ではない。
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k2,2 -k1,1r
B x 1
A y 1
B z 0
B z 1
A z 0

2カラム目でソートしてから、1カラム目で逆順にソートしてから、3カラム目で逆順にソートする。
# ODER BY 2カラム目 ASC、1カラム目 DESC、3カラム目 DESC、なイメージ。
# B z 1
# B z 0 <= ここら辺の順番を"B z 0","B z 1"にする場合は -k3,3r => -k3,3
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k2,2 -k1,1r -k3,3r
B x 1
A y 1
B z 1
B z 0
A z 0

バイト単位でソートの場合。
# 多分utf-8の場合は大丈夫。
LC_ALL=C sort

2013-08-23

memo: tomcat

http://www.mulesoft.com/using-tomcat-reload-features-speed-development
http://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/core/ContainerBase.html
http://wiki.gentoo.org/wiki/Apache_Tomcat
http://www.searchman.info/java_eclipse/1040.html

$ cat /var/lib/tomcat-7-main/conf/Catalina/localhost/test001.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context
    reloadable="true"
    backgroundProcessorDelay="1"
    >
  <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

再起動が遅い。
reloadable="true"でも読み込みが遅い。10秒。
javac xxx.java => xxx.class で出力途中のファイルが読み込まれるとおかしくなる。メモリリーク。

意味は無いかもしれない。
javac -d ./tmp/ -classpath "/usr/share/tomcat-servlet-api-3.0/lib/servlet-api.jar" HelloWorld.java && mv -f ./tmp/HelloWorld.class .

jspは関係ないかもしれない。
eclipseを使うのが正解かもしれない。

$ grep -nriP "backgroundProcessorDelay\s*=" apache-tomcat-7.0.32-src/
apache-tomcat-7.0.32-src/java/org/apache/catalina/core/StandardEngine.java:76:        backgroundProcessorDelay = 10;
apache-tomcat-7.0.32-src/java/org/apache/catalina/core/ContainerBase.java:176:    protected int backgroundProcessorDelay = -1;
apache-tomcat-7.0.32-src/java/org/apache/catalina/core/ContainerBase.java:370:        backgroundProcessorDelay = delay;

backgroundProcessorDelayはreloadable限定の設定ではないのでテスト以外で変な値にするとダメかもしれない。

$ grep -iP "java|tomcat" /var/lib/portage/world | while read pkgname; do eix -I $pkgname | grep -P "(^\[I\]\s)|(^\s*Installed versions:)"; done
[I] dev-java/jdbc-mysql
     Installed versions:  5.1.18^t(08:14:30 08/22/13)(-c3p0 -log4j -source ELIBC="-FreeBSD")
[I] dev-java/struts
     Installed versions:  1.2.9-r3(1.2)(05:50:48 04/06/13)(doc examples source ELIBC="-FreeBSD")
[I] www-servers/tomcat
     Installed versions:  7.0.32(7)^t(06:25:34 04/06/13)(doc extra-webapps source -test ELIBC="-FreeBSD")

#$ sudo /usr/share/tomcat-7/gentoo/tomcat-instance-manager.bash --create
#$ sudo /usr/share/tomcat-7/gentoo/tomcat-instance-manager.bash --remove
$ sudo /usr/share/tomcat-7/gentoo/tomcat-instance-manager.bash --create --suffix main

$ cat /var/lib/tomcat-7-main/webapps/test001/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app
    version="3.0"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>HelloWorld</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>
      hello
    </servlet-name>
    <url-pattern>
      /hello
    </url-pattern>
  </servlet-mapping>

</web-app>

$ cat /var/lib/tomcat-7-main/webapps/test001/WEB-INF/classes/HelloWorld.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloWorld extends HttpServlet {
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
        throws IOException, ServletException
    {

        PrintWriter out = response.getWriter();
        out.println("HelloWorld.");
        out.close();
    }
}

javac -d ./tmp/ -classpath "/usr/share/tomcat-servlet-api-3.0/lib/servlet-api.jar" HelloWorld.java && mv -f ./tmp/HelloWorld.class .

$ tail -n0 -f /var/log/tomcat-7-main/catalina.2013-08-23.log
Aug 23, 2013 8:23:02 AM org.apache.catalina.core.StandardContext reload
INFO: Reloading Context with name [/test001] has started
Aug 23, 2013 8:23:02 AM org.apache.catalina.core.StandardContext reload
INFO: Reloading Context with name [/test001] is completed

/var/lib/tomcat-7-main/conf/Catalina/localhost/test001.xml
/var/lib/tomcat-7-main/webapps/test001/WEB-INF/classes/HelloWorld.java
/var/lib/tomcat-7-main/webapps/test001/WEB-INF/web.xml

$ curl http://localhost:8080/test001/hello
HelloWorld.1

2013-08-19

memo: MF-HTU332GBK

https://downloadcenter.intel.com/SearchResult.aspx?lang=jpn&ProductFamily=%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E8%A3%BD%E5%93%81&ProductLine=%E3%83%81%E3%83%83%E3%83%97%E3%82%BB%E3%83%83%E3%83%88%E3%83%BB%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2&ProductProduct=%E3%82%A4%E3%83%B3%E3%83%86%E3%83%AB%C2%AE+%E3%83%81%E3%83%83%E3%83%97%E3%82%BB%E3%83%83%E3%83%88%E3%83%BB%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%BB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%BB%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3%E3%83%BC

Windows 7 (64-bit)*
ドライバ

https://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&DwnldID=20775&ProdId=816&lang=jpn&OSVersion=Windows%207%20%2864-bit%29*&DownloadType=%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90

Intel® Chipset Device Software (INF Update Utility)

ファイル名:infinst_autol.exe
バージョン:9.4.0.1022

多分これを入れればOK.








FRGS515T/Dというパソコンを使っているがUSB3のメモリが認識しないことがわかった。

http://www.cpuid.com/softwares/cpu-z.html

cpu-z_1.66-setup-en.exe

IPMSB-DA-B75-8111D-ODM という名前だった。

https://downloadcenter.intel.com/confirm.aspx?httpDown=http://downloadmirror.intel.com/21129/eng/Intel%28R%29_USB_3.0_eXtensible_Host_Controller_Driver.zip&lang=jpn&Dwnldid=21129

Intel(R)_USB_3.0_eXtensible_Host_Controller_Driver.zip
Setup.exe

インストールの要件を満たしていないと言われた。

http://devid.info/model/64712

381415.devid.info.exe

実行してみたが別に有効にならなかった。

Setup.exe

今度は普通に実行できた。

再起動後USB3で認識した。

-----------------------------------------------------------------------
CrystalDiskMark 3.0.2 x64 (C) 2007-2012 hiyohiyo
                           Crystal Dew World : http://crystalmark.info/
-----------------------------------------------------------------------
* MB/s = 1,000,000 byte/s [SATA/300 = 300,000,000 byte/s]

           Sequential Read :    98.028 MB/s
          Sequential Write :    18.916 MB/s
         Random Read 512KB :    92.102 MB/s
        Random Write 512KB :    14.686 MB/s
    Random Read 4KB (QD=1) :     7.474 MB/s [  1824.8 IOPS]
   Random Write 4KB (QD=1) :     1.287 MB/s [   314.3 IOPS]
   Random Read 4KB (QD=32) :     9.690 MB/s [  2365.7 IOPS]
  Random Write 4KB (QD=32) :     1.552 MB/s [   378.9 IOPS]

  Test : 50 MB [I: 0.0% (0.0/28.9 GB)] (x5)
  Date : 2013/08/19 22:40:37
    OS : Windows 7 Professional SP1 [6.1 Build 7601] (x64)
  

MF-HTU332GBK です。

-----------------------------------------------------------------------
CrystalDiskMark 3.0.2 x64 (C) 2007-2012 hiyohiyo
                           Crystal Dew World : http://crystalmark.info/
-----------------------------------------------------------------------
* MB/s = 1,000,000 byte/s [SATA/300 = 300,000,000 byte/s]

           Sequential Read :   132.104 MB/s
          Sequential Write :    21.324 MB/s
         Random Read 512KB :   102.089 MB/s
        Random Write 512KB :    15.955 MB/s
    Random Read 4KB (QD=1) :     7.524 MB/s [  1836.9 IOPS]
   Random Write 4KB (QD=1) :     1.285 MB/s [   313.7 IOPS]
   Random Read 4KB (QD=32) :     9.869 MB/s [  2409.5 IOPS]
  Random Write 4KB (QD=32) :     1.560 MB/s [   381.0 IOPS]

  Test : 50 MB [I: 0.3% (0.1/28.8 GB)] (x5)
  Date : 2013/08/20 0:15:43
    OS : Windows 7 Professional SP1 [6.1 Build 7601] (x64)
  
exFAT
32768 キロバイト
取り外しポリシー
高パフォーマンス

2013-08-18

memo: postgresql, mysql

/etc/mysql/my.cnf /etc/postgresql-9.2/postgresql.conf 変更無し。

$ eix -C dev-db "^(mysql|postgresql-server)$"|grep "Installed versions:"
     Installed versions:  5.1.70(11時28分41秒 2013年08月18日)(community perl ssl -big-tables -cluster -debug -embedded -extraengine -latin1 -max-idx-128 -minimal -pbxt -profiling -selinux -static -test -xtradb)
     Installed versions:  9.2.4(9.2)(12時40分02秒 2013年08月18日)(nls pam perl -doc -kerberos -pg_legacytimestamp -python -selinux -tcl -test -uuid -xml KERNEL="linux" LINGUAS="-af -cs -de -en -es -fa -fr -hr -hu -it -ko -nb -pl -pt_BR -ro -ru -sk -sl -sv -tr -zh_CN -zh_TW" PYTHON_SINGLE_TARGET="python2_7 -python2_5 -python2_6 -python3_1 -python3_2 -python3_3" PYTHON_TARGETS="python2_7 python3_2 -python2_5 -python2_6 -python3_1 -python3_3")

$ sudo su - -c "echo 3 > /proc/sys/vm/drop_caches"
$ sudo /etc/init.d/mysql restart

mysql> create table test004 (id serial, data text) ENGINE=innodb;
Query OK, 0 rows affected (0.04 sec)

mysql> show create table test004\G
*************************** 1. row ***************************
       Table: test004
Create Table: CREATE TABLE `test004` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `data` text,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

$ for cnt in $(seq 1 10); do ab -n2000 -c200 http://192.168.0.110:2000/ 2>&1 | grep -iP "^((Non-2xx responses)|(Failed requests)|(   \\(Connect)|(Complete requests)|(Requests per second)):"; done | sort | uniq -c | sort -k1nr,5n
     10 Complete requests:      2000
     10 Failed requests:        0
      1 Requests per second:    206.60 [#/sec] (mean)
      1 Requests per second:    213.36 [#/sec] (mean)
      1 Requests per second:    221.74 [#/sec] (mean)
      1 Requests per second:    221.75 [#/sec] (mean)
      1 Requests per second:    224.32 [#/sec] (mean)
      1 Requests per second:    226.38 [#/sec] (mean)
      1 Requests per second:    239.60 [#/sec] (mean)
      1 Requests per second:    242.41 [#/sec] (mean)
      1 Requests per second:    242.47 [#/sec] (mean)
      1 Requests per second:    265.60 [#/sec] (mean)

mysql> select * from test004 order by id desc limit 1;
+-------+----------------------------+
| id    | data                       |
+-------+----------------------------+
| 20011 | 2013-08-18 11:59:06.715882 |
+-------+----------------------------+
1 row in set (0.03 sec)

$ sudo su - -c "echo 3 > /proc/sys/vm/drop_caches"
$ sudo /etc/init.d/mysql restart

mysql> drop table test004;
Query OK, 0 rows affected (0.00 sec)

mysql> create table test004 (id serial, data text) ENGINE=myisam;
Query OK, 0 rows affected (0.03 sec)

mysql> show create table test004\G
*************************** 1. row ***************************
       Table: test004
Create Table: CREATE TABLE `test004` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `data` text,
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

$ for cnt in $(seq 1 10); do ab -n2000 -c200 http://192.168.0.110:2000/ 2>&1 | grep -iP "^((Non-2xx responses)|(Failed requests)|(   \\(Connect)|(Complete requests)|(Requests per second)):"; done | sort | uniq -c | sort -k1nr,5n
     10 Complete requests:      2000
     10 Failed requests:        0
      1 Requests per second:    2402.95 [#/sec] (mean)
      1 Requests per second:    2435.10 [#/sec] (mean)
      1 Requests per second:    2438.26 [#/sec] (mean)
      1 Requests per second:    2471.78 [#/sec] (mean)
      1 Requests per second:    3124.24 [#/sec] (mean)
      1 Requests per second:    3176.14 [#/sec] (mean)
      1 Requests per second:    3179.68 [#/sec] (mean)
      1 Requests per second:    3180.62 [#/sec] (mean)
      1 Requests per second:    3232.88 [#/sec] (mean)
      1 Requests per second:    3235.57 [#/sec] (mean)

mysql> select * from test004 order by id desc limit 1;
+-------+----------------------------+
| id    | data                       |
+-------+----------------------------+
| 20000 | 2013-08-18 12:01:47.475692 |
+-------+----------------------------+
1 row in set (0.03 sec)

$ sudo su - -c "echo 3 > /proc/sys/vm/drop_caches"
$ sudo /etc/init.d/postgresql-9.2 restart

dbname=# drop table test004;
ERROR:  テーブル"test004"は存在しません
dbname=# create table test004 (id serial, data text);
NOTICE:  CREATE TABLEはシリアル列"test004.id"用に暗黙的なシーケンス"test004_id_seq"を作成します。
CREATE TABLE

$ for cnt in $(seq 1 10); do ab -n2000 -c200 http://192.168.0.110:2000/ 2>&1 | grep -iP "^((Non-2xx responses)|(Failed requests)|(   \\(Connect)|(Complete requests)|(Requests per second)):"; done | sort | uniq -c | sort -k1nr,5n
     10 Complete requests:      2000
     10 Failed requests:        0
      1 Requests per second:    1117.53 [#/sec] (mean)
      1 Requests per second:    1136.16 [#/sec] (mean)
      1 Requests per second:    1144.23 [#/sec] (mean)
      1 Requests per second:    1147.27 [#/sec] (mean)
      1 Requests per second:    1155.13 [#/sec] (mean)
      1 Requests per second:    1155.26 [#/sec] (mean)
      1 Requests per second:    1163.53 [#/sec] (mean)
      1 Requests per second:    1163.71 [#/sec] (mean)
      1 Requests per second:    1164.36 [#/sec] (mean)
      1 Requests per second:    974.07 [#/sec] (mean)

dbname=# select * from test004 order by id desc limit 1;
  id   |            data
-------+----------------------------
 20000 | 2013-08-18 13:05:01.021865
(1 行)

http://www.php.net/manual/ja/libevent.examples.php
https://gist.github.com/joseph-montanez/1122992
http://www.php.net/manual/ja/book.http.php

この結果はチューニングをしてなく内容も単純なので参考でしかありませんが
この中ではトランザクションとSQLが使いたいのであればpostgresqlが良く
SQLが使いたいのであればmysql-myisamが良いです。
またpeclのlibeventはphpからnodejsに変えるか検討している場合には
nodejs以外の選択肢の一つになると思います。

vmware playerのディスク拡張の例

vmware playerのディスク拡張の例です。
LVMは使っていません。
パーテーションが1つだけか、サイズを増やしたいパーテーションがディスクの最後にある場合の例です。

失敗に備えてコピーします。
C:\Users\username\Documents\Virtual Machines\GentooLinux-x86_64
C:\Users\username\Documents\Virtual Machines\GentooLinux-x86_64 - コピー

BIOSの画面でキーが押せない場合に追加します。
c:/Users/username/Documents/Virtual Machines/GentooLinux-x86_64/GentooLinux-x86_64.vmx

bios.bootDelay = "5000"

linuxの入ったイメージファイルをダウンロードします。
http://ftp.jaist.ac.jp/pub/Linux/Gentoo/releases/amd64/current-iso/

install-amd64-minimal-20130816.iso

CDを入れます。
仮想マシン設定の編集
  CD/DVD(IDE)
    デバイスのステータス
      起動時に接続、にチェック
    ISOイメージファイルを使用する
      C:\Users\username\Downloads\ユーティリティ\iso\install-amd64-minimal-20130816.iso

ハードディスクを拡張します。
ハードディスク(SCSI)  30GB
  ユーティリティ
    拡張
      ディスク最大サイズ(GB) 30.0 => 32.0
ハードディスク(SCSI)  32GB

CDで起動します。
仮想マシンの再生
  画面をクリック
    Escキーを押す。(F2でBIOSメニュー)
      Boot Menu
        CD-ROM Drive

linuxを起動します。
boot:
  Enterキーを押す

...

livecd ~ #

キー配列を設定し、
パスワードを設定し、
IPアドレスを確認し、
sshサーバを起動します。
loadkeys jp106
passwd
ifconfig
/etc/init.d/sshd start

sshで接続します。
ディスクを確認します。その際 head, tail は必要無いです。
ssh 192.168.0.2

livecd ~ # cd /tmp/

livecd tmp # fdisk -l /dev/sda | head -n2 | tail -n1
Disk /dev/sda: 34.4 GB, 34359738368 bytes, 67108864 sectors

livecd tmp # fdisk -l /dev/sda1 | head -n2 | tail -n1
Disk /dev/sda1: 32.2 GB, 32211206144 bytes, 62912512 sectors

fdiskを起動します。
2048 62914559 などの表示をコピペなどしときます。
fdisk /dev/sda

Command (m for help): w [Enter] しないと保存しないのでhelpを見ながら操作する。

Command (m for help): q [Enter] でセーブせずに戻る。

Command (m for help): p
...
/dev/sda1            2048    62914559    31456256   83  Linux

削除して新しいパーテーションを作成します。
2048 が同じで、
62914559 が増えています。
Command (m for help): d
Selected partition 1
Partition 1 is deleted

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
Using default value 1
First sector (2048-67108863, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-67108863, default 67108863):
Using default value 67108863
Partition 1 of type Linux and of size 32 GiB is set

Command (m for help): p

Disk /dev/sda: 34.4 GB, 34359738368 bytes, 67108864 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x70c133cf

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048    67108863    33553408   83  Linux

書き込みます。
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
livecd tmp #

リサイズします。
resize2fs の -p は作業完了分のパーセントを表すバーを表示します。
livecd tmp # resize2fs /dev/sda1
resize2fs 1.42.7 (21-Jan-2013)
Please run 'e2fsck -f /dev/sda1' first.

livecd tmp # e2fsck -f /dev/sda1
e2fsck 1.42.7 (21-Jan-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/: 682914/1966080 files (0.2% non-contiguous), 3760376/7864064 blocks

livecd tmp # resize2fs -p /dev/sda1
resize2fs 1.42.7 (21-Jan-2013)
Resizing the filesystem on /dev/sda1 to 8388352 (4k) blocks.
The filesystem on /dev/sda1 is now 8388352 blocks long.

確認します。
livecd tmp # fdisk -l /dev/sda | head -n2 | tail -n1
Disk /dev/sda: 34.4 GB, 34359738368 bytes, 67108864 sectors

livecd tmp # fdisk -l /dev/sda1 | head -n2 | tail -n1
Disk /dev/sda1: 34.4 GB, 34358689792 bytes, 67106816 sectors

リードオンリーでマウントして確認します。
大丈夫そうであればシャットダウンします。
livecd tmp # mkdir sda1

livecd tmp # mount -r /dev/sda1 sda1/

livecd tmp # df|grep sda1
/dev/sda1       32895856 14420948  16797244  47% /tmp/sda1

livecd tmp # df -h|grep sda1
/dev/sda1        32G   14G   17G  47% /tmp/sda1

livecd tmp # mount | grep sda1
/dev/sda1 on /tmp/sda1 type ext4 (ro)

livecd tmp # umount sda1/

livecd tmp # shutdown -h now

CDでの起動を無効化します。
仮想マシン設定の編集
  CD/DVD(IDE)
    デバイスのステータス
      起動時に接続、のチェックを外す

起動すれば成功です。

2013-08-16

memo: bash-completion

http://forums.gentoo.org/viewtopic-t-898628-start-0.html
http://d.hatena.ne.jp/pcmaster/20101021/p1

sudo emerge --oneshot -avt app-shells/bash-completion

sudo eselect bashcomp enable --global gentoo
sudo eselect bashcomp enable --global ssh
#sudo eselect bashcomp enable --global base

$ ssh bash: _known_hosts_real: コマンドが見つかりません
bash: _known_hosts_real: コマンドが見つかりません

sudo eselect bashcomp enable --global base

$ ll /etc/bash_completion.d/
合計 0
lrwxrwxrwx 1 root root 36 2013-08-16 23:34:38 base -> ../../usr/share/bash-completion/base
lrwxrwxrwx 1 root root 38 2013-08-16 23:24:29 gentoo -> ../../usr/share/bash-completion/gentoo
lrwxrwxrwx 1 root root 35 2013-08-16 23:33:00 ssh -> ../../usr/share/bash-completion/ssh

$ grep -iP "^\s*have\s+\w+\s+\&\&" /etc/bash_completion.d/* | perl -pe 's/^.*:have (\w+).*$/$1/' | while read cmd; do which $cmd 2>/dev/null; if [ $? -ne 0 ]; then echo "### "$cmd; fi; done
/usr/bin/emerge
/usr/bin/ebuild
/sbin/rc
/usr/bin/equery
/usr/bin/epkginfo
### ekeyword
/usr/bin/portageq
### splat
/usr/bin/euse
### epm
### metagen
/usr/bin/ssh

memo: postgresql

http://www.postgresql.jp/document/9.2/html/indexes.html
http://dqn.sakusakutto.jp/2011/11/postgresql.html
http://d.hatena.ne.jp/y-kawaz/20090226/1235623336
http://lets.postgresql.jp/documents/technical/bulkload/
http://www.techscore.com/blog/2013/03/12/%E9%9B%86%E5%90%88%E3%82%92%E8%BF%94%E3%81%99generate_series%E9%96%A2%E6%95%B0%E3%81%A7%E5%A4%A7%E9%87%8F%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E7%94%9F%E6%88%90%E3%81%97%E3%81%A6%E9%9B%86%E8%A8%88/
http://longkey1.net/blog/2013/05/09/clear-postgresql-caches/
http://www.glamenv-septzen.net/view/725
http://d.hatena.ne.jp/hhelibex/20110609/1307620714
http://www.ksknet.net/postgresql/primary_key.html
http://www.postgresql.jp/document/9.2/html/sql-commands.html
http://dba.stackexchange.com/questions/2070/postgresql-count-uses-a-sequential-scan-not-index
http://stackoverflow.com/questions/2204058/show-which-columns-an-index-is-on-in-postgresql
http://stackoverflow.com/questions/3524859/how-to-display-full-stored-procedure-code
http://serverfault.com/questions/34741/postgres-equivalent-to-mysqls-g
http://www.pgadmin.org/
http://stansantiago.wordpress.com/2011/10/30/install-and-configure-pl-php-for-postgres-9-1/
http://www.atmarkit.co.jp/ait/articles/0810/01/news134_3.html
http://lets.postgresql.jp/documents/tutorial/gihyo_rensai/5/
http://lets.postgresql.jp/documents/technical/text-processing/3
http://aoi-f.blog.so-net.ne.jp/2011-05-15

目的は、
postgresqlはどうだろう?使ったことある、
pgadminは便利だったような気がする、
phpをトリガーの言語で使えたような気がするが今は無い、
などです。

テスト環境です。
$ uname -a
Linux vmware-gentoo1 3.8.13-gentoo #1 SMP Thu May 16 19:10:40 JST 2013 x86_64 Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz GenuineIntel GNU/Linux

$ emerge --info|grep -P "^(CFLAGS|CXXFLAGS|CHOST)="
CFLAGS="-march=native -O2"
CHOST="x86_64-pc-linux-gnu"
CXXFLAGS="-march=native -O2"

$ LC_ALL=C lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                3
On-line CPU(s) list:   0-2
Thread(s) per core:    1
Core(s) per socket:    3
Socket(s):             1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 58
Stepping:              9
CPU MHz:               3192.820
BogoMIPS:              6385.64
Hypervisor vendor:     VMware
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              6144K

$ free
             total       used       free     shared    buffers     cached
Mem:       8170124    1313924    6856200          0     159176     610836
-/+ buffers/cache:     543912    7626212
Swap:       131068          0     131068

インストールします。
$ grep postgresql /etc/portage/package.use/x86_64-pc-linux-gnu
dev-db/postgresql-server       perl
$ sudo emerge --oneshot -avt dev-db/postgresql-server
$ sudo emerge --config dev-db/postgresql-server:9.2

ユーザーを作成します。
# 多分"-a"は非推奨。"-s"が正解。
$ sudo createuser -a -E -P -U postgres dbuser

設定を変更します。
$ /usr/bin/sudo /usr/bin/rcsdiff /etc/config-archive/etc/postgresql-9.2/postgresql.conf,v /etc/postgresql-9.2/postgresql.conf
===================================================================
RCS file: /etc/config-archive/etc/postgresql-9.2/postgresql.conf,v
retrieving revision 1.1
diff -r1.1 /etc/postgresql-9.2/postgresql.conf
59c59
< #listen_addresses = 'localhost'          # what IP address(es) to listen on;
---
> listen_addresses = '192.168.0.110'       # what IP address(es) to listen on;
64c64
< max_connections = 100                      # (change requires restart)
---
> max_connections = 1000                     # (change requires restart)
113c113
< shared_buffers = 32MB                      # min 128kB
---
> shared_buffers = 2048MB                    # min 128kB

設定を変更します。
$ /usr/bin/sudo /usr/bin/rcsdiff /etc/config-archive/etc/postgresql-9.2/pg_hba.conf,v /etc/postgresql-9.2/pg_hba.conf
===================================================================
RCS file: /etc/config-archive/etc/postgresql-9.2/pg_hba.conf,v
retrieving revision 1.1
diff -r1.1 /etc/postgresql-9.2/pg_hba.conf
86a87
> host    all             dbuser            192.168.0.110/24        md5

とりあえずOFFにします。ONの場合安全に再起動。
$ rcsdiff -u -U4 /etc/config-archive/etc/conf.d/postgresql-9.2,v /etc/conf.d/postgresql-9.2
===================================================================
RCS file: /etc/config-archive/etc/conf.d/postgresql-9.2,v
retrieving revision 1.1
diff -u -U4 -r1.1 /etc/conf.d/postgresql-9.2
--- /etc/conf.d/postgresql-9.2  2013/08/15 08:13:01     1.1
+++ /etc/conf.d/postgresql-9.2  2013/08/16 04:21:27
@@ -12,9 +12,9 @@
 # Forecfully disconnect clients from server and shut down. This is performed
 # after NICE_QUIT. Terminated client connections have their open transactions
 # rolled back.
 # Set RUDE_QUIT to "NO" to disable. RUDE_TIMEOUT in seconds.
-RUDE_QUIT="YES"
+RUDE_QUIT="NO"
 RUDE_TIMEOUT=30

 # If the server still fails to shutdown, you can force it to quit by setting
 # this to YES and a recover-run will execute on the next startup.

plperlを入れます。
$ createlang -h 192.168.0.110 -U dbuser plperl dbname

再起動します。
$ sudo /etc/init.d/postgresql-9.2 restart

psqlで接続します。
# pgadmin3を入れて起動しておくと便利です。
$ psql -h 192.168.0.110 -U dbuser dbname

時間を計ります。
dbname=# \timing
タイミングは on です。

ランダムな文字を作成する関数を作成します。
dbname=# \x
Expanded display is on.
dbname=# SELECT prosrc FROM pg_proc WHERE proname = 'randstr';
-[ RECORD 1 ]----------------------------------------------
prosrc | # http://aoi-f.blog.so-net.ne.jp/2011-05-15
       |
       | use strict;
       |
       | my $ret = "";
       |
       | my $length = $_[0];
       |
       | my @char_tmp=();
       |
       | push @char_tmp, ('a'..'z');
       | push @char_tmp, ('A'..'Z');
       | push @char_tmp, (0..9);
       |
       | my $rand_str_tmp = '';
       | my $cnt = $#char_tmp;
       |
       | for (my $i=1; $i<=$length; $i++) {
       |     $rand_str_tmp .= $char_tmp[int(rand($cnt+1))];
       | }
       |
       | return $rand_str_tmp;
       |

Time: 2.506 ms
dbname=# \x
Expanded display is off.

テストテーブルを作成します。
dbname=# DROP TABLE test003;
DROP TABLE
時間: 5.686 ms
dbname=# CREATE TABLE test003 (id SERIAL, data VARCHAR(255));
NOTICE:  CREATE TABLEはシリアル列"test003.id"用に暗黙的なシーケンス"test003_id_seq"を作成します。
CREATE TABLE
時間: 3.490 ms
dbname=# \d test003
                              テーブル "public.test003"
  列  |           型           |                        修飾語
------+------------------------+------------------------------------------------------
 id   | integer                | not null default nextval('test003_id_seq'::regclass)
 data | character varying(255) |

テストテーブルの serial を後回しにします。
dbname=# DROP TABLE test003;
DROP TABLE
時間: 3.348 ms
dbname=# CREATE TABLE test003 (id INTEGER, data VARCHAR(255));
CREATE TABLE
時間: 2.262 ms
dbname=# CREATE SEQUENCE test003_id_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;
CREATE SEQUENCE
時間: 2.420 ms
dbname=# ALTER TABLE test003_id_seq
  OWNER TO dbuser;
ALTER TABLE
時間: 0.688 ms
dbname=# ALTER SEQUENCE test003_id_seq OWNED BY test003.id;
ALTER SEQUENCE
時間: 1.429 ms
dbname=# ALTER TABLE test003 ALTER COLUMN id SET NOT NULL;
ALTER TABLE
時間: 1.396 ms
dbname=# ALTER TABLE test003 ALTER COLUMN id SET DEFAULT nextval('test003_id_seq'::regclass);
ALTER TABLE
時間: 1.994 ms
dbname=# \d test003
                              テーブル "public.test003"
  列  |           型           |                        修飾語
------+------------------------+------------------------------------------------------
 id   | integer                | not null default nextval('test003_id_seq'::regclass)
 data | character varying(255) |

10件INSERTします。
dbname=# DROP TABLE test003;
DROP TABLE
時間: 2.531 ms
dbname=# CREATE TABLE test003 (id INTEGER, data VARCHAR(255));
CREATE TABLE
時間: 2.185 ms
dbname=# INSERT INTO test003 (data) SELECT randstr((FLOOR(RANDOM()*250)+1)::INT) AS data FROM GENERATE_SERIES(1, 10);
INSERT 0 10
時間: 3.071 ms
dbname=# SELECT COUNT(data) FROM test003;
 count
-------
    10
(1 行)

時間: 0.826 ms
dbname=# SELECT LENGTH(data) AS len, COUNT(data) AS cnt FROM test003 GROUP BY len ORDER BY len ASC;
 len | cnt
-----+-----
   5 |   1
  20 |   1
  53 |   1
  54 |   1
  58 |   1
  64 |   1
  68 |   1
  82 |   1
 119 |   1
 243 |   1
(10 行)

時間: 1.192 ms

ある程度INSERTします。
dbname=# INSERT INTO test003 (data) SELECT randstr((FLOOR(RANDOM()*250)+1)::INT) AS data FROM GENERATE_SERIES(1, 100);
INSERT 0 100
時間: 11.091 ms
dbname=# INSERT INTO test003 (data) SELECT randstr((FLOOR(RANDOM()*250)+1)::INT) AS data FROM GENERATE_SERIES(1, 1000);
INSERT 0 1000
時間: 65.906 ms
dbname=# INSERT INTO test003 (data) SELECT randstr((FLOOR(RANDOM()*250)+1)::INT) AS data FROM GENERATE_SERIES(1, 10000);
INSERT 0 10000
時間: 424.606 ms
dbname=# INSERT INTO test003 (data) SELECT randstr((FLOOR(RANDOM()*250)+1)::INT) AS data FROM GENERATE_SERIES(1, 100000);
INSERT 0 100000
時間: 4210.131 ms
dbname=# INSERT INTO test003 (data) SELECT randstr((FLOOR(RANDOM()*250)+1)::INT) AS data FROM GENERATE_SERIES(1, 1000000);
INSERT 0 1000000
時間: 41347.289 ms
dbname=# SELECT COUNT(data) FROM test003;
  count
---------
 1111110
(1 行)

時間: 153.315 ms
dbname=# SELECT LENGTH(data) AS len, COUNT(data) AS cnt FROM test003 GROUP BY len ORDER BY len ASC;
 len | cnt
-----+------
   1 | 4572
   2 | 4354
   3 | 4488

... snip ...

 248 | 4435
 249 | 4477
 250 | 4445
(250 行)

時間: 2228.025 ms
dbname=# SELECT LENGTH(data) AS len, COUNT(data) AS cnt FROM test003 GROUP BY len ORDER BY len ASC LIMIT 1;
 len | cnt
-----+------
   1 | 4572
(1 行)

時間: 1860.114 ms
dbname=# SELECT LENGTH(data) AS len, COUNT(data) AS cnt FROM test003 GROUP BY len ORDER BY len DESC LIMIT 1;
 len | cnt
-----+------
 250 | 4445
(1 行)

時間: 1874.450 ms

約1000万レコードでテストに移ります。
dbname=# INSERT INTO test003 (data) SELECT randstr((FLOOR(RANDOM()*250)+1)::INT) AS data FROM GENERATE_SERIES(1, 10000000);
INSERT 0 10000000
時間: 410982.963 ms
dbname=# SELECT COUNT(data) FROM test003;
  count
----------
 11111110
(1 行)

時間: 1408.626 ms
dbname=# SELECT LENGTH(data) AS len, COUNT(data) AS cnt FROM test003 GROUP BY len ORDER BY len ASC LIMIT 1;
 len |  cnt
-----+-------
   1 | 44672
(1 行)

時間: 85998.609 ms
dbname=# SELECT LENGTH(data) AS len, COUNT(data) AS cnt FROM test003 GROUP BY len ORDER BY len DESC LIMIT 1;
 len |  cnt
-----+-------
 250 | 44174
(1 行)

時間: 87158.518 ms
dbname=#

# 非常に怪しいランダムの偏りです。 RANDOM() の使用法に誤りがあります。

serial を戻します。
dbname=# CREATE SEQUENCE test003_id_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;
CREATE SEQUENCE
時間: 27.763 ms
dbname=# ALTER TABLE test003_id_seq
  OWNER TO dbuser;
ALTER TABLE
時間: 0.705 ms
dbname=# ALTER SEQUENCE test003_id_seq OWNED BY test003.id;
ALTER SEQUENCE
時間: 1.378 ms
dbname=# ALTER TABLE test003 ALTER COLUMN id SET NOT NULL;
ERROR:  列"id"にはNULL値があります
時間: 36.759 ms
dbname=# ALTER TABLE test003 ALTER COLUMN id SET DEFAULT nextval('test003_id_seq'::regclass);
ALTER TABLE
時間: 2.010 ms
dbname=# UPDATE test003 SET id=nextval('test003_id_seq'::regclass);
UPDATE 11111110
時間: 125298.068 ms
dbname=# ALTER TABLE test003 ALTER COLUMN id SET NOT NULL;
ALTER TABLE
時間: 3793.104 ms
dbname=# \d test003
                              テーブル "public.test003"
  列  |           型           |                        修飾語
------+------------------------+------------------------------------------------------
 id   | integer                | not null default nextval('test003_id_seq'::regclass)
 data | character varying(255) |

dbname=#

serial が正常か確認します。
dbname=# \d test003_id_seq
      シーケンス "public.test003_id_seq"
      列       |   型    |         値
---------------+---------+---------------------
 sequence_name | name    | test003_id_seq
 last_value    | bigint  | 11111110
 start_value   | bigint  | 1
 increment_by  | bigint  | 1
 max_value     | bigint  | 9223372036854775807
 min_value     | bigint  | 1
 cache_value   | bigint  | 1
 log_cnt       | bigint  | 13
 is_cycled     | boolean | f
 is_called     | boolean | t
所有者: public.test003.id

dbname=# SELECT id, LENGTH(data) FROM test003 ORDER BY id DESC LIMIT 2;
    id    | length
----------+--------
 11111110 |    103
 11111109 |    214
(2 行)

時間: 6080.592 ms
dbname=# INSERT INTO test003 (data) SELECT randstr((FLOOR(RANDOM()*250)+1)::INT) AS data FROM GENERATE_SERIES(1, 1);
INSERT 0 1
時間: 16.984 ms
dbname=# SELECT id, LENGTH(data) FROM test003 ORDER BY id DESC LIMIT 2;
    id    | length
----------+--------
 11111111 |     47
 11111110 |    103
(2 行)

時間: 6044.897 ms

インデックス優先にします。
dbname=# SET ENABLE_SEQSCAN = FALSE;
SET
時間: 0.382 ms

primary key を追加します。
dbname=# ALTER TABLE test003 ADD PRIMARY KEY(id);
NOTICE:  ALTER TABLE / ADD PRIMARY KEYはテーブル"test003"に暗黙的なインデックス"test003_pkey"を作成します
ALTER TABLE
時間: 13328.882 ms

dbname=# SELECT id, LENGTH(data) FROM test003 ORDER BY id DESC LIMIT 2;
    id    | length
----------+--------
 11111111 |     47
 11111110 |    103
(2 行)

時間: 1.277 ms
dbname=# SELECT id, LENGTH(data) FROM test003 ORDER BY id ASC LIMIT 2;
 id | length
----+--------
  1 |     68
  2 |    119
(2 行)

時間: 0.886 ms
dbname=# EXPLAIN SELECT id, LENGTH(data) FROM test003 ORDER BY id ASC LIMIT 2;
                                            QUERY PLAN
--------------------------------------------------------------------------------------------------
 Limit  (cost=0.00..7.78 rows=2 width=131)
   ->  Index Scan using test003_pkey on test003  (cost=0.00..43216749.91 rows=11111111 width=131)
(2 行)

時間: 0.807 ms

集約関数にindexは貼れないことを確認します。
dbname=# SELECT COUNT(data) FROM test003;
  count
----------
 11111111
(1 行)

時間: 1494.485 ms
dbname=# EXPLAIN SELECT COUNT(data) FROM test003;
                                        QUERY PLAN
------------------------------------------------------------------------------------------
 Aggregate  (cost=10000579709.89..10000579709.90 rows=1 width=127)
   ->  Seq Scan on test003  (cost=10000000000.00..10000551932.11 rows=11111111 width=127)
(2 行)

時間: 0.569 ms
dbname=# CREATE INDEX ON test003 (COUNT(data));
ERROR:  式インデックスには集約関数を使用できません
時間: 1001.837 ms
dbname=# SELECT reltuples FROM pg_class WHERE oid = 'test003'::regclass;
  reltuples
-------------
 1.11111e+07
(1 行)

時間: 1.378 ms

COUNT の書き方を試しています。
dbname=# SELECT COUNT(id) FROM test003;
  count
----------
 11111111
(1 行)

時間: 2903.467 ms
dbname=# EXPLAIN SELECT COUNT(id) FROM test003;
                                         QUERY PLAN
---------------------------------------------------------------------------------------------
 Aggregate  (cost=759916.69..759916.70 rows=1 width=4)
   ->  Bitmap Heap Scan on test003  (cost=180206.80..732138.91 rows=11111111 width=4)
         ->  Bitmap Index Scan on test003_pkey  (cost=0.00..177429.02 rows=11111111 width=0)
(3 行)

時間: 0.670 ms
dbname=# SELECT *, COUNT(*) OVER() AS cntall FROM test003 ORDER BY id DESC LIMIT 1;
    id    |                      data                       |  cntall
----------+-------------------------------------------------+----------
 11111111 | vonjFJ3RCln0ohF65zQQ5isLbe1O1AoI0QnJT4iyOGAm42t | 11111111
(1 行)

時間: 97596.188 ms
dbname=# SELECT reltuples::bigint FROM pg_class WHERE oid = 'test003'::regclass;
 reltuples
-----------
  11250615
(1 行)

時間: 9.842 ms
dbname=# explain SELECT *, COUNT(id) OVER() AS cntall FROM test003 ORDER BY id DESC LIMIT 1;
                                                   QUERY PLAN
----------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.00..0.21 rows=1 width=131)
   ->  WindowAgg  (cost=0.00..2396190.51 rows=11244966 width=131)
         ->  Index Scan Backward using test003_pkey on test003  (cost=0.00..2255628.43 rows=11244966 width=131)
(3 行)

時間: 2.019 ms
dbname=# SELECT *, COUNT(id) OVER() AS cntall FROM test003 ORDER BY id DESC LIMIT 1;
    id    |                      data                       |  cntall
----------+-------------------------------------------------+----------
 11111111 | vonjFJ3RCln0ohF65zQQ5isLbe1O1AoI0QnJT4iyOGAm42t | 11111111
(1 行)

時間: 14490.027 ms

explain が変化しました。多分統計情報が集まってきたためです。
dbname=# SELECT COUNT(id) FROM test003;
  count
----------
 11111111
(1 行)

時間: 1078.204 ms
dbname=# explain SELECT COUNT(id) FROM test003;
                                            QUERY PLAN
---------------------------------------------------------------------------------------------------
 Aggregate  (cost=318660.37..318660.38 rows=1 width=4)
   ->  Index Only Scan using test003_pkey on test003  (cost=0.00..290547.96 rows=11244966 width=4)
(2 行)

時間: 0.727 ms

work_mem を確認します。
$ sudo grep work_mem /etc/postgresql-9.2/*
/etc/postgresql-9.2/postgresql.conf:#work_mem = 1MB                             # min 64kB
/etc/postgresql-9.2/postgresql.conf:#maintenance_work_mem = 16MB                # min 1MB

LENGTH(data) にインデックスを貼ります。
dbname=# SELECT LENGTH(data) AS len, COUNT(data) AS cnt FROM test003 GROUP BY len ORDER BY len DESC LIMIT 1;
 len |  cnt
-----+-------
 250 | 44174
(1 行)

時間: 125475.003 ms
dbname=# explain SELECT LENGTH(data) AS len, COUNT(data) AS cnt FROM test003 GROUP BY len ORDER BY len DESC LIMIT 1;
                                              QUERY PLAN
------------------------------------------------------------------------------------------------------
 Limit  (cost=10004819382.67..10004819382.70 rows=1 width=127)
   ->  GroupAggregate  (cost=10004819382.67..10004964150.97 rows=4834484 width=127)
         ->  Sort  (cost=10004819382.67..10004847495.09 rows=11244966 width=127)
               Sort Key: (length((data)::text))
               ->  Seq Scan on test003  (cost=10000000000.00..10000581383.08 rows=11244966 width=127)
(5 行)

時間: 0.963 ms
dbname=#

dbname=# CREATE INDEX ON test003 (LENGTH(data));
CREATE INDEX
時間: 37074.003 ms

dbname=# explain SELECT LENGTH(data) AS len, COUNT(data) AS cnt FROM test003 GROUP BY len ORDER BY len DESC LIMIT 1;
                                                      QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.00..9.07 rows=1 width=127)
   ->  GroupAggregate  (cost=0.00..43332017.17 rows=4776936 width=127)
         ->  Index Scan Backward using test003_length_idx on test003  (cost=0.00..43216749.91 rows=11111111 width=127)
(3 行)

時間: 1.398 ms

dbname=# SELECT LENGTH(data) AS len, COUNT(data) AS cnt FROM test003 GROUP BY len ORDER BY len DESC LIMIT 1;
 len |  cnt
-----+-------
 250 | 44174
(1 行)

時間: 111.031 ms
dbname=#

LIKE に似た絞込みにインデックスを貼ります。
dbname=# SELECT COUNT(data) AS cnt FROM test003 WHERE data LIKE 'a%';
  cnt
--------
 179465
(1 行)

時間: 1934.644 ms
dbname=# explain SELECT COUNT(data) AS cnt FROM test003 WHERE data LIKE 'a%';
                                       QUERY PLAN
----------------------------------------------------------------------------------------
 Aggregate  (cost=10000579991.33..10000579991.34 rows=1 width=127)
   ->  Seq Scan on test003  (cost=10000000000.00..10000579709.89 rows=112578 width=127)
         Filter: ((data)::text ~~ 'a%'::text)
(3 行)

時間: 1.167 ms
dbname=#

LIKE に似た絞込みにインデックスを貼ります。
dbname=# CREATE INDEX ON test003 (substr(data, 1, 1));
CREATE INDEX
時間: 62754.251 ms
dbname=# SELECT COUNT(data) AS cnt FROM test003 WHERE substr(data, 1, 1) = 'a';
  cnt
--------
 179465
(1 行)

時間: 3131.558 ms
dbname=# explain SELECT COUNT(data) AS cnt FROM test003 WHERE substr(data, 1, 1) = 'a';
                                          QUERY PLAN
----------------------------------------------------------------------------------------------
 Aggregate  (cost=157082.20..157082.21 rows=1 width=127)
   ->  Bitmap Heap Scan on test003  (cost=1044.03..156943.31 rows=55556 width=127)
         Recheck Cond: (substr((data)::text, 1, 1) = 'a'::text)
         ->  Bitmap Index Scan on test003_substr_idx  (cost=0.00..1030.14 rows=55556 width=0)
               Index Cond: (substr((data)::text, 1, 1) = 'a'::text)
(5 行)

時間: 1.048 ms
dbname=#

LIKE に似た絞込みにインデックスを貼ります。
dbname=# CREATE INDEX ON test003 (substr(data::text, 1, 1));
CREATE INDEX
時間: 62361.070 ms
dbname=# explain SELECT COUNT(data) AS cnt FROM test003 WHERE substr(data::text, 1, 1) = 'a';
                                          QUERY PLAN
-----------------------------------------------------------------------------------------------
 Aggregate  (cost=157082.20..157082.21 rows=1 width=127)
   ->  Bitmap Heap Scan on test003  (cost=1044.03..156943.31 rows=55556 width=127)
         Recheck Cond: (substr((data)::text, 1, 1) = 'a'::text)
         ->  Bitmap Index Scan on test003_substr_idx1  (cost=0.00..1030.14 rows=55556 width=0)
               Index Cond: (substr((data)::text, 1, 1) = 'a'::text)
(5 行)

時間: 1.409 ms
dbname=# SELECT COUNT(data) AS cnt FROM test003 WHERE substr(data::text, 1, 1) = 'a';
  cnt
--------
 179465
(1 行)

時間: 3078.055 ms
dbname=#

LIKE に似た絞込みにインデックスを貼ります。
dbname=# CREATE INDEX ON test003 (substr(data::text, 1, 2));
CREATE INDEX
時間: 65614.633 ms
dbname=# explain SELECT COUNT(data) AS cnt FROM test003 WHERE substr(data::text, 1, 2) = 'ab';
                                          QUERY PLAN
-----------------------------------------------------------------------------------------------
 Aggregate  (cost=157082.20..157082.21 rows=1 width=127)
   ->  Bitmap Heap Scan on test003  (cost=1044.03..156943.31 rows=55556 width=127)
         Recheck Cond: (substr((data)::text, 1, 2) = 'ab'::text)
         ->  Bitmap Index Scan on test003_substr_idx2  (cost=0.00..1030.14 rows=55556 width=0)
               Index Cond: (substr((data)::text, 1, 2) = 'ab'::text)
(5 行)

時間: 0.904 ms
dbname=# SELECT COUNT(data) AS cnt FROM test003 WHERE substr(data::text, 1, 2) = 'ab';
 cnt
------
 2873
(1 行)

時間: 8.811 ms
dbname=#

dbname=# SELECT COUNT(data) AS cnt FROM test003 WHERE data LIKE 'ab%';
 cnt
------
 2873
(1 行)

時間: 1856.263 ms
dbname=#

LIKE に似た絞込みにインデックスを貼ります。
dbname=# SELECT COUNT(data) AS cnt FROM test003 WHERE data LIKE 'abc%';
 cnt
-----
  48
(1 行)

時間: 1887.597 ms
dbname=# CREATE INDEX ON test003 (substr(data::text, 1, 3));
CREATE INDEX
時間: 69296.781 ms
dbname=# SELECT COUNT(data) AS cnt FROM test003 WHERE substr(data::text, 1, 3) = 'abc';
 cnt
-----
  48
(1 行)

時間: 0.988 ms
dbname=# explain SELECT COUNT(data) AS cnt FROM test003 WHERE substr(data::text, 1, 3) = 'abc';
                                          QUERY PLAN
-----------------------------------------------------------------------------------------------
 Aggregate  (cost=157082.20..157082.21 rows=1 width=127)
   ->  Bitmap Heap Scan on test003  (cost=1044.03..156943.31 rows=55556 width=127)
         Recheck Cond: (substr((data)::text, 1, 3) = 'abc'::text)
         ->  Bitmap Index Scan on test003_substr_idx3  (cost=0.00..1030.14 rows=55556 width=0)
               Index Cond: (substr((data)::text, 1, 3) = 'abc'::text)
(5 行)

時間: 1.042 ms
dbname=#

カウント数がざっくりで良い場合は使えます。
更新しなければ時間が経つと正確なカウント数が取れるかもしれません。
dbname=# SELECT reltuples::bigint FROM pg_class WHERE oid = 'test003'::regclass;
 reltuples
-----------
  11111111
(1 行)

時間: 1.109 ms

統計情報を見ます。
dbname=# select * from report_tablesize where relname like 'test003%';
       relname       | relkind |     rows     |      bytes
---------------------+---------+--------------+------------------
 test003             | r       |   11,111,111 |    3,611,205,632
 test003_id_seq      | S       |            1 |            8,192
 test003_length_idx  | i       |   11,111,111 |      249,593,856
 test003_pkey        | i       |   11,111,111 |      249,593,856
 test003_substr_idx  | i       |   11,111,111 |      249,593,856
 test003_substr_idx1 | i       |   11,111,111 |      249,593,856
 test003_substr_idx2 | i       |   11,111,111 |      249,593,856
 test003_substr_idx3 | i       |   11,111,111 |      249,593,856
(8 行)

時間: 1.175 ms

統計情報を見ます。
drop view report_tablesize;
CREATE VIEW report_tablesize AS

SELECT
  relname,
  relkind,
  to_char(reltuples, '999,999,999') as rows,
  to_char(pg_relation_size(relname::regclass), '999,999,999,999') as bytes
FROM pg_class
WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname='public');

COMMENT ON VIEW report_tablesize IS '現在のテーブルサイズ';

統計情報を見ます。
dbname=# select * from report_tablesize where relname like 'test003%' and relkind='i';
       relname       | relkind |     rows     |      bytes
---------------------+---------+--------------+------------------
 test003_length_idx  | i       |   11,111,111 |      249,593,856
 test003_pkey        | i       |   11,111,111 |      249,593,856
 test003_substr_idx3 | i       |   11,111,111 |      249,593,856
(3 行)

時間: 1.506 ms

COUNT をキャッシュします。
dbname=# CREATE TABLE mytablerowcount (id SERIAL, name VARCHAR(63) NOT NULL, cnt BIGINT NOT NULL);
NOTICE:  CREATE TABLEはシリアル列"mytablerowcount.id"用に暗黙的なシーケンス"mytablerowcount_id_seq"を作成します。
CREATE TABLE
時間: 46.575 ms

dbname=# ALTER TABLE mytablerowcount ADD UNIQUE (name);
NOTICE:  ALTER TABLE / ADD UNIQUEはテーブル"mytablerowcount"に暗黙的なインデックス"mytablerowcount_name_key"を作成します
ALTER TABLE
時間: 26.638 ms

COUNT をキャッシュします。
dbname=# select * from mytablerowcount;
 id |  name   | cnt
----+---------+------
 16 | test004 | 2280
(1 row)

dbname=# select get_mytablerowcount('test003');
 get_mytablerowcount
---------------------
            11111111
(1 row)

dbname=# select * from mytablerowcount;
 id |  name   |   cnt
----+---------+----------
 17 | test003 | 11111111
 16 | test004 |     2280
(2 rows)

dbname=# \timing
Timing is on.
dbname=# select get_mytablerowcount('test003');
 get_mytablerowcount
---------------------
            11111111
(1 row)

Time: 1.892 ms
dbname=# INSERT INTO test003 (data) SELECT randstr((FLOOR(RANDOM()*250)+1)::INT) AS data FROM GENERATE_SERIES(1, 10);
INSERT 0 10
Time: 403.743 ms
dbname=# select get_mytablerowcount('test003');
 get_mytablerowcount
---------------------
            11111121
(1 row)

Time: 1.805 ms

COUNT をキャッシュします。
dbname=# select * from mytablerowcount where name='test003'; select count(id) from test003; select get_mytablerowcount('test003'); SELECT reltuples::bigint FROM pg_class WHERE oid = 'test003'::regclass;
 id |  name   |   cnt
----+---------+----------
 17 | test003 | 11111121
(1 row)

Time: 0.714 ms
  count
----------
 11111121
(1 row)

Time: 1036.212 ms
 get_mytablerowcount
---------------------
            11111121
(1 row)

Time: 0.852 ms
 reltuples
-----------
  11111111
(1 row)

Time: 0.603 ms
dbname=#

COUNT をキャッシュします。
-- Function: set_mytablerowcount()

-- DROP FUNCTION set_mytablerowcount();

CREATE OR REPLACE FUNCTION set_mytablerowcount()
  RETURNS trigger AS
$BODY$

use strict;

my $res;

=pod
unless (($_TD->{event} eq "INSERT" || $_TD->{event} eq "UPDATE") &&
        ($_TD->{when} eq "BEFORE") &&
        ($_TD->{level} eq "ROW"))
{
    elog(ERROR, "CRITICAL: this call timing is invalid. (event = $_TD->{event}, when = $_TD->{when}, level = $_TD->{level})");
}
=cut

if (! defined $_SHARED{stmt_mytablerowcount}->{$_TD->{table_name}})
{
    spi_exec_query("SELECT init_mytablerowcount('" . quote_ident($_TD->{table_name}) . "')");
}

$res = spi_exec_prepared($_SHARED{stmt_mytablerowcount}->{$_TD->{table_name}}->{insert}, {limit => 1}, $_TD->{table_name});

if ($res->{processed} != 1)
{
    elog(ERROR, "affected rows != 1.");
}

return;

$BODY$
  LANGUAGE plperl VOLATILE
  COST 100;
ALTER FUNCTION set_mytablerowcount()
  OWNER TO dbuser;

COUNT をキャッシュします。
-- Function: init_mytablerowcount(text)

-- DROP FUNCTION init_mytablerowcount(text);

CREATE OR REPLACE FUNCTION init_mytablerowcount(table_name text)
  RETURNS void AS
$BODY$

use strict;

my $table_name = $_[0];

my $sql;
my $cnt;

$sql = 'SELECT cnt FROM mytablerowcount WHERE name = $1';
$_SHARED{stmt_mytablerowcount}->{$table_name}->{select} = spi_prepare($sql, 'TEXT');

$sql = 'UPDATE mytablerowcount SET cnt=cnt+1 WHERE name = $1';
$_SHARED{stmt_mytablerowcount}->{$table_name}->{insert} = spi_prepare($sql, 'TEXT');

$sql = 'UPDATE mytablerowcount SET cnt=cnt-1 WHERE name = $1';
$_SHARED{stmt_mytablerowcount}->{$table_name}->{delete} = spi_prepare($sql, 'TEXT');

$sql = 'INSERT INTO mytablerowcount (name, cnt) VALUES ($1, (SELECT COUNT(id) FROM ' . quote_ident($table_name) . '))';
$_SHARED{stmt_mytablerowcount}->{$table_name}->{init} = spi_prepare($sql, 'TEXT');

$cnt = spi_exec_prepared($_SHARED{stmt_mytablerowcount}->{$table_name}->{select},
    {limit => 1}, $table_name)->{rows}[0]->{cnt};

if (defined $cnt)
{
}
else
{
    my $res = spi_exec_prepared($_SHARED{stmt_mytablerowcount}->{$table_name}->{init}, {limit => 1}, $table_name);
}

$BODY$
  LANGUAGE plperl VOLATILE
  COST 100;
ALTER FUNCTION init_mytablerowcount(text)
  OWNER TO dbuser;

COUNT をキャッシュします。
-- Function: get_mytablerowcount(text)

-- DROP FUNCTION get_mytablerowcount(text);

CREATE OR REPLACE FUNCTION get_mytablerowcount(table_name text)
  RETURNS bigint AS
$BODY$

use strict;

my $table_name = $_[0];
my $ret = 0;
my $cnt;

if (! defined $_SHARED{stmt_mytablerowcount}->{$_TD->{table_name}})
{
    spi_exec_query("SELECT init_mytablerowcount('" . quote_ident($table_name) . "')");
}

$cnt = spi_exec_prepared($_SHARED{stmt_mytablerowcount}->{$table_name}->{select},
    {limit => 1}, $table_name)->{rows}[0]->{cnt};

if (defined $cnt)
{
    $ret = $cnt;
}

return $cnt;

$BODY$
  LANGUAGE plperl VOLATILE
  COST 100;
ALTER FUNCTION get_mytablerowcount(text)
  OWNER TO dbuser;

randstr です。
-- Function: randstr(integer)

-- DROP FUNCTION randstr(integer);

CREATE OR REPLACE FUNCTION randstr(len integer)
  RETURNS text AS
$BODY$# http://aoi-f.blog.so-net.ne.jp/2011-05-15

use strict;

my $ret = "";

my $length = $_[0];

my @char_tmp=();

push @char_tmp, ('a'..'z');
push @char_tmp, ('A'..'Z');
push @char_tmp, (0..9);

my $rand_str_tmp = '';
my $cnt = $#char_tmp;

for (my $i=1; $i<=$length; $i++) {
    $rand_str_tmp .= $char_tmp[int(rand($cnt+1))];
}
    
return $rand_str_tmp;
$BODY$
  LANGUAGE plperl VOLATILE
  COST 100;
ALTER FUNCTION randstr(integer)
  OWNER TO dbuser;

画面が一つの場合 "Ctrl + Z => fg" で戻れます。
$ psql -h 192.168.0.110 -U dbuser dbname
ユーザ dbuser のパスワード:
psql (9.2.4)
"help" でヘルプを表示します.

dbname=# ^Z
[1]+  停止                  psql -h 192.168.0.110 -U dbuser dbname
$ sudo su - -c "echo 3 > /proc/sys/vm/drop_caches"
$ fg
psql -h 192.168.0.110 -U dbuser dbname

dbname=#

random()は0.5足して四捨五入が正解かもしれません。
可能であれば更新時に数えとけば集約関数の遅さもOKです。上記の例ではdeleteしてもカウント数が減りません。余計なことをする分、更新スピードは下がります。
pgadmin3は便利です。しかし画面左側のオブジェクトブラウザのツリーが、何かの作成時などに閉じてしまうことがあるのがうざいです。
検索サイト経由でpostgresqlのマニュアルを探すとバージョンがバラバラなのでローカルに検索できる環境を用意したほうが良いです。
pgadmin3に接続しているサーバのバージョンにマッチしたマニュアルの該当項目にジャンプするような右クリックのメニューがあるといいなと思います。
昔substr(data::text, 1, 3)でインデックスを作ってdata like 'abc%'とやるとインデックスを使ったような気がしましたが気のせいです。もしくは設定です。
pl/phpは9でも使えるようですが試していません。

2013-08-13

memo: httpd.conf

ServerRoot "/usr/local/apache_mod-php"
Listen 8084
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule php5_module        modules/libphp5.so
LoadModule xsendfile_module   modules/mod_xsendfile.so
LoadModule alias_module modules/mod_alias.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule logio_module modules/mod_logio.so
User daemon
Group daemon
ServerAdmin you@example.com
ServerName vmware-gentoo1
<Directory />
    AllowOverride None
    Options None
    Require all denied
</Directory>
DocumentRoot "/usr/local/apache_mod-php/htdocs/"
ForceType application/x-httpd-php
EnableSendfile On
XSendFile on
XSendFilePath /usr/local/apache_mod-php/files/download/
<Directory "/usr/local/apache_mod-php/files/download/">
    AllowOverride None
    Options None
    Require all granted
</Directory>
Alias / /usr/local/apache_mod-php/scripts/php/index.php/
<Directory "/usr/local/apache_mod-php/scripts/php/">
    AllowOverride None
    Options None
    Require all granted
</Directory>
ErrorDocument 400 "400 Bad Request"
ErrorDocument 401 "401 Unauthorized"
ErrorDocument 402 "402 Payment Required"
ErrorDocument 403 "403 Forbidden"
ErrorDocument 404 "404 Not Found"
ErrorDocument 405 "405 Method Not Allowed"
ErrorDocument 406 "406 Not Acceptable"
ErrorDocument 407 "407 Proxy Authentication Required"
ErrorDocument 408 "408 Request Timeout"
ErrorDocument 409 "409 Conflict"
ErrorDocument 410 "410 Gone"
ErrorDocument 411 "411 Length Required"
ErrorDocument 412 "412 Precondition Failed"
ErrorDocument 413 "413 Request Entity Too Large"
ErrorDocument 414 "414 Request-URI Too Long"
ErrorDocument 415 "415 Unsupported Media Type"
ErrorDocument 416 "416 Requested Range Not Satisfiable"
ErrorDocument 417 "417 Expectation Failed"
ErrorDocument 500 "500 Internal Server Error"
ErrorDocument 501 "501 Not Implemented"
ErrorDocument 502 "502 Bad Gateway"
ErrorDocument 503 "503 Service Unavailable"
ErrorDocument 504 "504 Gateway Timeout"
ErrorDocument 505 "505 HTTP Version Not Supported"
ErrorLog "logs/error_log"
LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O \"%{id}n\" \"%{time}n\"" combinedio
CustomLog "logs/access_log" combinedio
ServerTokens ProductOnly
StartServers             3
MinSpareThreads        750
MaxSpareThreads        750
ThreadsPerChild        250
MaxRequestWorkers      750
MaxConnectionsPerChild 25000
ServerLimit              3
ThreadLimit            750
MaxKeepAliveRequests   500
KeepAlive               On
KeepAliveTimeout         3
ListenBacklog        65535

// sample. \"%{id}n\" \"%{time}n\"
// auto_prepend_file etc.
{
    function microtime_float()
    {
        list($usec, $sec) = explode(" ", microtime());
        return ((float)$usec + (float)$sec);
    }
    register_shutdown_function(function ($timeStart) {
            apache_note("time", sprintf("%.5f", microtime_float() - $timeStart));
            apache_note("id", mydb::getuid());
        }, microtime_float());
}
// dummy.
class mydb
{
    static function getuid()
    {
        return "dummy-" . substr(md5(microtime()), 0, 8);
    }
}

/manual/をindex.phpでは無いアクセスにする場合。
# なにかが必要。
LoadModule xxx_module   modules/mod_xxx.so
# Alias / の前に書く。
Alias /manual/ /usr/local/apache_mod-php/manual/
<Directory "/usr/local/apache_mod-php/manual/">
    AllowOverride None
    Options None
    Require all granted
    ForceType None
</Directory>

...

Alias / /usr/local/apache_mod-php/scripts/php/index.php/

2013-08-11

memo: hhvm

https://github.com/facebook/hiphop-php/wiki/Building-and-installing-HHVM-on-Ubuntu-13.04
http://sourceforge.net/projects/levent/files/libevent/libevent-1.4/
http://shinodogg.com/?p=4780
https://github.com/facebook/hiphop-php/wiki/Prebuilt-Packages-on-Debian-7-%28wheezy%29
http://d.hatena.ne.jp/hagaeru3sei/20110426

gitの使い方がわからなくregress.gen.hを持ってこれないのでlibevent-1.4.14b-stable.tar.gzを使った。
...
$ cmake .
...

ライブラリが足りないので入れた。
$ sudo emerge --oneshot -avt dev-libs/boost

# USE: dev-cpp/glog                    unwind
$ sudo emerge --oneshot -avt dev-cpp/glog

$ sudo emerge --oneshot -avt =dev-libs/libmemcached-0.39

$ sudo emerge --oneshot -avt media-libs/gd

$ sudo emerge --oneshot -avt dev-cpp/tbb

$ sudo emerge --oneshot -avt net-nds/openldap

$ sudo layman -a ikelos
$ sudo emerge --oneshot -avt =dev-libs/libdwarf-20120410

$ sudo emerge --oneshot -avt net-libs/c-client

makeが失敗するので該当するライブラリを再インストールした。
...
$ cmake .
...
-- Configuring done
-- Generating done
-- Build files have been written to: /usr/local/hhvm/2013-08-11/hiphop-php
$ make
...
Linking CXX executable hhvm
../../bin/libhphp_runtime.a(ext_image.cpp.o): 関数 `HPHP::f_imagecreatefromstring(HPHP::String const&)' 内:
ext_image.cpp:(.text+0x2b17): `gdImageCreateFromJpegCtx' に対する定義されていない参照です
ext_image.cpp:(.text+0x2c5b): `gdImageCreateFromPngCtx' に対する定義されていない参照です
...

# USE: media-libs/gd                   jpeg png
$ sudo emerge --oneshot -avt media-libs/gd

makeが終わった。
$ make
...
[100%] Building CXX object hphp/test/CMakeFiles/test.dir/__/hhvm/global-variables.cpp.o
Linking CXX executable test
Embedding systemlib.php in test
[100%] Built target test

インストールに失敗しているように見える。
$ ./hphp/hhvm/hhvm
HipHop Notice: File could not be loaded:
$ ldd ./hphp/hhvm/hhvm | wc -l
49
$ file ./hphp/hhvm/hhvm
./hphp/hhvm/hhvm: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
$ ./hphp/hhvm/hhvm --help | wc -l
52

$ (echo "<?php" && echo "phpinfo();") > /tmp/phpinfo.php
$ ./hphp/hhvm/hhvm /tmp/phpinfo.php
HipHop

webサーバを起動した。
cd /usr/local/hhvm/
...
$ /usr/local/hhvm/2013-08-11/hiphop-php/hphp/hhvm/hhvm --mode daemon --config conf/hhvm.hdf

phpinfo()が変なのは仕様かもしれない。
$ /usr/local/hhvm/2013-08-11/hiphop-php/hphp/hhvm/hhvm -m debug
hphpd> <?php
 ..... print "test";
 ..... ?>
test
hphpd> <?php
 ..... phpinfo();
 ..... ?>
HipHop

hphpd> quit

テスト。
$ cat htdocs/hello.php
<?php
print "hello world.";

$ curl http://127.0.0.1:8080/hello.php
hello world.

もっとボリュームのある物でzendopcacheなどを入れた物と比べないと分からない。
$ ab -n 1000 -c 100 http://127.0.0.1:8080/hello.php 2>&1 | grep -iP "^((Non-2xx responses)|(Failed requests)|(   \\(Connect)|(Complete requests)|(Requests per second)):"
Complete requests:      1000
Failed requests:        0
Requests per second:    5587.53 [#/sec] (mean)

$ ab -n 10000 -c 1000 http://127.0.0.1:8080/hello.php 2>&1 | grep -iP "^((Non-2xx responses)|(Failed requests)|(   \\(Connect)|(Complete requests)|(Requests per second)):"
Complete requests:      10000
Failed requests:        0
Requests per second:    4559.82 [#/sec] (mean)

$ ab -n 100000 -c 10000 http://127.0.0.1:8080/hello.php 2>&1 | grep -iP "^((Non-2xx responses)|(Failed requests)|(   \\(Connect)|(Complete requests)|(Requests per second)):"
Complete requests:      100000
Failed requests:        0
Requests per second:    5056.28 [#/sec] (mean)

$ ab -n 200000 -c 20000 http://127.0.0.1:8080/hello.php 2>&1 | grep -iP "^((Non-2xx responses)|(Failed requests)|(   \\(Connect)|(Complete requests)|(Requests per second)):"
Complete requests:      200000
Failed requests:        0
Requests per second:    3104.54 [#/sec] (mean)

memo: uwsgi + php-embed

http://php.net/manual/ja/install.pecl.static.php
http://www.php.net/manual/ja/faq.installation.php#faq.installation.apache2
http://uwsgi-docs.readthedocs.org/en/latest/Options.html#enable-threads
https://github.com/unbit/uwsgi-docs/blob/master/PHP.rst
http://uwsgi-docs.readthedocs.org/en/latest/Install.html
http://wiki.nginx.org/HttpUwsgiModule
http://wiki.nginx.org/HttpUwsgiModuleMultipleDynamicApplications
http://wiki.nginx.org/HttpUwsgiModule#uwsgi_next_upstream
http://uwsgi-docs.readthedocs.org/en/latest/Nginx.html
http://wiki.nginx.org/NginxHttpUpstreamModule#upstream
http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/www-servers/uwsgi/files/1.1.2-threaded-php.patch?diff_format=s&view=markup
http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/www-servers/uwsgi/uwsgi-1.4.9.ebuild?view=markup

cd /usr/local/src/
sudo mkdir nginx-uwsgi-php
sudo chown userName.userName nginx-uwsgi-php/
cd nginx-uwsgi-php/
wget http://nginx.org/download/nginx-1.5.3.tar.gz
wget http://jp2.php.net/get/php-5.5.1.tar.bz2/from/jp1.php.net/mirror
file mirror
mv -i mirror php-5.5.1.tar.bz2
cp -i /usr/portage/distfiles/uwsgi-1.4.9.tar.gz .
tar xzvf nginx-1.5.3.tar.gz
cd nginx-1.5.3

PATH="/usr/bin:/bin" CFLAGS="-march=native -O2" CHOST="x86_64-pc-linux-gnu" CXXFLAGS="-march=native -O2" ./configure --prefix=/usr/local/nginx-uwsgi-php --without-select_module --without-poll_module --without-http_charset_module --without-http_gzip_module --without-http_ssi_module --without-http_userid_module --without-http_access_module --without-http_auth_basic_module --without-http_autoindex_module --without-http_geo_module --without-http_map_module --without-http_split_clients_module --without-http_referer_module --without-http_rewrite_module --without-http_proxy_module --without-http_fastcgi_module --without-http_scgi_module --without-http_memcached_module --without-http_limit_conn_module --without-http_limit_req_module --without-http_empty_gif_module --without-http_browser_module --without-http_upstream_ip_hash_module --without-http_upstream_least_conn_module --without-http_upstream_keepalive_module --without-http-cache --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --without-pcre

make
make install
sudo make install

cd /usr/local/nginx-uwsgi-php/conf/
diff nginx.conf.default nginx.conf
emacs nginx.conf
...

opcache未対応, xcacheエラー, apcエラーだった。
php-embedはアクセラレーターが使えない。多分。使えるのがあるかも。
http://en.wikipedia.org/wiki/List_of_PHP_accelerators

手前に必要な機能だけのnginx + apache.worker(もしくはevent)+mod_phpでapacheはmod_php以外のことをしない。できなくする。最低限の状態にする。
apacheはcpuの数だけ立ち上げる。もしくはcpux2+1など。
とすればphpだけでthread safeな状態で、なんかあってもwebサーバまでは巻き込まないとか。
nginxはupstreamの基本機能だけもしくは追加とか。nginx -tで機能が足りない=>再インストール。
もしくは面倒なのでそんなことしない。
普通にapache.workerかapache.eventでthread safeでServerLimit,StartServersをcpu数にして動かせばいい。

dev-php/pecl-apc-3.1.13はapache.workerと相性が悪いかもしれない。
dev-php/pecl-zendopcache-7.0.2はOKっぽい。5.5.1のソースではext/の下にある。
http://pecl.php.net/package/ZendOpcache
http://www.1x1.jp/blog/2013/04/php55_replace_apc_with_zend_opcache.html

$ grep -B79 NGX_HTTP_UPSTREAM_FT_UPDATING ./src/http/ngx_http_upstream.c | head -n5
#if (NGX_HTTP_CACHE)

static ngx_int_t
ngx_http_upstream_cache(ngx_http_request_t *r, ngx_http_upstream_t *u)
{

$ grep -A2 -B2 NGX_HTTP_UPSTREAM_FT_UPDATING ./src/http/ngx_http_upstream.c
    case NGX_HTTP_CACHE_UPDATING:

        if (u->conf->cache_use_stale & NGX_HTTP_UPSTREAM_FT_UPDATING) {
            u->cache_status = rc;
            rc = NGX_OK;

$ grep -B8 -A3 NGX_HTTP_UPSTREAM_FT_UPDATING ./src/http/modules/ngx_http_uwsgi_module.c
static ngx_conf_bitmask_t ngx_http_uwsgi_next_upstream_masks[] = {
    { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },
    { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },
    { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },
    { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },
    { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },
    { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 },
    { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },
    { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING },
    { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },
    { ngx_null_string, 0 }
};

memo: emacs

http://d.hatena.ne.jp/hirukiyo/20091204/1259938895
http://sky-y.hatenablog.jp/entry/20111224/1324714853
http://qiita.com/acple@github/items/4be7eb774a28d574281e

$ env | grep -P "^(HOME|ALTERNATE_EDITOR|EMACS_SERVER_FILE|cd)=" | sort
ALTERNATE_EDITOR=C:\gnupack\gnupack_basic-10.02\emacs.exe
cd=C:\gnupack\gnupack_basic-10.02\home
EMACS_SERVER_FILE=C:\gnupack\gnupack_basic-10.02\home\.emacs.d\server\server
HOME=/home

$ env | grep -P '\QC:\gnupack\gnupack_basic-10.02\home\E'
EMACS_SERVER_FILE=C:\gnupack\gnupack_basic-10.02\home\.emacs.d\server\server
cd=C:\gnupack\gnupack_basic-10.02\home

memo: diff

http://linuxjm.sourceforge.jp/html/gnumaniak/man1/diff.1.html
http://te2u.hatenablog.jp/entry/20090206/p2
http://d.hatena.ne.jp/youhey/20091028/1256748465

diff -BbwE old new

diff --strip-trailing-cr linux.txt windows.txt

-b, --ignore-space-change
スペースの数だけが違う場合には違いを無視する。不完全な行は無視される。


-i, --ignore-case
英大文字と小文字の違いを無視する。


-w, --ignore-all-space
行を比較するときスペースを無視する。不完全な行は無視される。


-x PATTERN, --exclude=PATTERN
ディレクトリを比較するとき、ファイル名の base 部が PATTERN にマッチするファイルやサブディレクトリを無視する。


-B, --ignore-blank-lines
空行を挿入・削除するだけの変更を無視する。


-E, --ignore-tab-expansion
タブ展開によるスペースの変更を無視する。


-I REGEXP, --ignore-matching-lines=REGEXP
REGEXP にマッチするような行を挿入・削除するだけの変更を無視する。


-XFILE, --exclude-from=FILE
ディレクトリを比較する際、ファイル名の base 部が FILE のパターンのいずれかにマッチするファイルやサブディレクトリを無視する。


--ignore-file-name-case
ファイルを比較する際にファイル名の大文字小文字を無視する。そのため ``foo'' と ``Foo'' は同じとされるので、互いに比較される。


--strip-trailing-cr
行末の CR を取り除く。行末のマーカとして CRLF を使うシステムの出力を処理するときに役立つ。

2013-08-09

php-fpm

http://redmine.lighttpd.net/issues/2422
http://www.ibm.com/developerworks/jp/linux/library/l-slurm-utility/
https://computing.llnl.gov/linux/slurm/high_throughput.html
https://sites.google.com/site/beingroot/articles/apache/socket-backlog-tuning-for-apache
http://www.linuxinstruction.com/?q=node/15
http://alpha-netzilla.blogspot.jp/2012/12/parameter-kernel.html

$ cat /etc/security/limits.conf | grep -vP "^#|^$"
* soft nofile 65535
* hard nofile 65535

$ rcsdiff /etc/config-archive/etc/php/fpm-php5.4/php-fpm.conf,v /etc/php/fpm-php5.4/php-fpm.conf
===================================================================
RCS file: /etc/config-archive/etc/php/fpm-php5.4/php-fpm.conf,v
retrieving revision 1.1
diff -r1.1 /etc/php/fpm-php5.4/php-fpm.conf
103a104
> listen.backlog = 65535
155c156
< pm.max_children = 50
---
> pm.max_children = 150
160a162
> pm.start_servers = 5
170c172
< pm.max_spare_servers = 35
---
> pm.max_spare_servers = 150
176a179
> pm.max_requests = 1000

$ rcsdiff /etc/config-archive/etc/nginx/nginx.conf,v /etc/nginx/nginx.conf
===================================================================
RCS file: /etc/config-archive/etc/nginx/nginx.conf,v
retrieving revision 1.1
diff -r1.1 /etc/nginx/nginx.conf
2a3
> worker_rlimit_nofile 65535;
7c8
<    worker_connections 1024;
---
>    worker_connections 65535;
49c50
<            listen 127.0.0.1;
---
>            listen 192.168.0.110:8081 backlog=65535;
55a57,62
>
>                 location ~ \.php($|/) {
>                 include fastcgi_params;
>                 fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
>                 fastcgi_pass   127.0.0.1:9000;
>                 }

2013-08-07

G-WAN

キャッシュは設定かもしれないが、環境によってはエラーの時本体ごと落ちるので注意が必要です。
php-cliを使うようだけど--enable-maintainer-ztsが必要とか?
本体ごと落ちるか切り離すか設定があるとか?
$ ./gwan



allowed sockets: 16384 ('sudo ./gwan' to let G-WAN use more sockets)

loading.
             loan.cs: to use   .cs scripts, install C#...
            hello.py: to use   .py scripts, install Python
            hello.go: to use   .go scripts, install Go
            hello.cs: to use   .cs scripts, install C#....
             argv.cs: to use   .cs scripts, install C#.




G-WAN 4.3.14 (pid:26197)



Signal        : 11:Unknown SIGSEGV problem
Signal src    : 128:.
errno         : 0
Thread        : 1
Code   Pointer: 0000004066e5 (module:gwan, function:??, line:0)
Access Address: 000000000000

Registers     : EAX=203e3d206e6f6973 CS=00000033 EIP=0000004066e5 EFLGS=000000010202
                EBX=7f55993fd000 SS=0000af30 ESP=7f55d3efb030 EBP=000000000080
                ECX=0000002a4943 DS=0000af30 ESI=7f5599446f50 FS=00000033
                EDX=0000002a4940 ES=0000af30 EDI=7f55993fd00c CS=00000033

Module         :Function        :Line # PgrmCntr(EIP)  RetAddress  FramePtr(EBP)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Segmentation fault

$ ./gwan



allowed sockets: 16384 ('sudo ./gwan' to let G-WAN use more sockets)

loading.
             loan.cs: to use   .cs scripts, install C#...
            hello.py: to use   .py scripts, install Python
            hello.go: to use   .go scripts, install Go
            hello.cs: to use   .cs scripts, install C#....
             argv.cs: to use   .cs scripts, install C#.




G-WAN 4.3.14 (pid:26508)



Signal        : 11:Unknown SIGSEGV problem
Signal src    : 128:.
errno         : 0
Thread        : 0
Code   Pointer: 0000004066e5 (module:gwan, function:??, line:0)
Access Address: 000000000000

Registers     : EAX=655a0a3a656e6967 CS=00000033 EIP=0000004066e5 EFLGS=000000010202
                EBX=7f3ecd3fd000 SS=00000007 ESP=7f3f0ca70030 EBP=7f3f0ca70248
                ECX=000000004003 DS=00000007 ESI=7f3ecd43bf80 FS=00000033
                EDX=7f3ecd43cf80 ES=00000007 EDI=7f3ecd3fd00c CS=00000033

Module         :Function        :Line # PgrmCntr(EIP)  RetAddress  FramePtr(EBP)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Segmentation fault

長さランダム
$ diff hello.php{,.2012-12-11_182422} | htmlescape
78,87d77
< ob_start();
< phpinfo();
< function make_seed()
< {
<     list($usec, $sec) = explode(' ', microtime());
<     return (float) $sec + ((float) $usec * 100000);
< }
< mt_srand(make_seed());
< print str_repeat("=", mt_rand(0, 127));
< print nl2br(htmlspecialchars(ob_get_clean()));

1回目はそれっぽい結果。
$ ab -n10000 -c 1000 "http://192.168.0.110:8080/?hello.php" 2>&1 | grep -iP "^((Non-2xx responses)|(Failed requests)|(   \\(Connect)|(Complete requests)|(Requests per second)):"
Complete requests:      10000
Failed requests:        10251
   (Connect: 0, Receive: 0, Length: 10251, Exceptions: 0)
Requests per second:    4098.55 [#/sec] (mean)

キャッシュ?
$ ab -n10000 -c 1000 "http://192.168.0.110:8080/?hello.php" 2>&1 | grep -iP "^((Non-2xx responses)|(Failed requests)|(   \\(Connect)|(Complete requests)|(Requests per second)):"
Complete requests:      10000
Failed requests:        0
Requests per second:    7014.31 [#/sec] (mean)

mt_rand(0, 127) => mt_rand(0, 65535)
とかにすると落ちたりもう一回起動すると大丈夫だったり。
Content-Lengthが変わるはずだけど変わらない。

spawn-fcgi -C

Failed requests Length
http://webmemo.uzuralife.com/article/2768

<?php
print str_repeat("=", mt_rand(0, 31));

$ ab -n 2000 -c 1000 "http://192.168.0.110:8081/phpinfo.php" 2>&1 | grep -iP "^((Non-2xx responses)|(Failed requests)|(   \\(Connect)|(Complete requests)|(Requests per second)):"
Complete requests:      2000
Failed requests:        1932
   (Connect: 0, Receive: 0, Length: 1932, Exceptions: 0)
Requests per second:    5085.11 [#/sec] (mean)

<?php
header("HTTP", true, 567);

$ ab -n 2000 -c 1000 "http://192.168.0.110:8081/phpinfo.php" 2>&1 | grep -iP "^((Non-2xx responses)|(Failed requests)|(   \\(Connect)|(Complete requests)|(Requests per second)):"
Complete requests:      2000
Failed requests:        0
Non-2xx responses:      2000
Requests per second:    5221.43 [#/sec] (mean)

<?php
print date("Y-m-d");

$ ab -n 2000 -c 1000 "http://192.168.0.110:8081/phpinfo.php" 2>&1 | grep -iP "^((Non-2xx responses)|(Failed requests)|(   \\(Connect)|(Complete requests)|(Requests per second)):"
Complete requests:      2000
Failed requests:        0
Requests per second:    5161.09 [#/sec] (mean)

<?php
phpinfo();

$ ab -n 2000 -c 1000 "http://192.168.0.110:8081/phpinfo.php" 2>&1 | grep -iP "^((Non-2xx responses)|(Failed requests)|(   \\(Connect)|(Complete requests)|(Requests per second)):"
Complete requests:      2000
Failed requests:        194
   (Connect: 0, Receive: 0, Length: 194, Exceptions: 0)
Requests per second:    1773.90 [#/sec] (mean)

fastcgiの場合php-fpmがある、が一応オプションが違う。(gentooの/etc/init.d/spawn-fcgiの場合)
$ spawn-fcgi -h|grep "\-C"
 -C   (PHP only) numbers of childs to spawn (default: not setting

$ sudo cp -i /etc/init.d/spawn-fcgi /etc/init.d/spawn-fcgi.php

$ diff -u /etc/init.d/spawn-fcgi{,.php}
--- /etc/init.d/spawn-fcgi      2013-08-07 19:41:12.088306975 +0900
+++ /etc/init.d/spawn-fcgi.php  2013-08-07 20:23:38.082024559 +0900
@@ -96,8 +96,9 @@

                env -i ${E} /sbin/start-stop-daemon --start --pidfile ${P} --exec ${SPAWNFCGI} \
                        --name ${FCGI_PROGRAM_EXEC} -- ${SOCKET_OPTION} ${INET_OPTION} \
-                       -P ${P} ${OPTIONS} -- ${FCGI_PROGRAM}
+                       -P ${P} ${OPTIONS} -C ${FCGI_CHILDREN} -- ${FCGI_PROGRAM}
                RETVAL=$?
+                break

                # Stop on error. Don't want to spawn a mess!
                [ "${RETVAL}" != "0" ] && break

$ diff /etc/conf.d/spawn-fcgi{,.php}
28c28
< FCGI_PORT=1234
---
> FCGI_PORT=9000
35c35
< FCGI_PROGRAM=
---
> FCGI_PROGRAM=/usr/bin/php-cgi
39c39
< FCGI_CHILDREN=1
---
> FCGI_CHILDREN=10

$ rcsdiff /etc/config-archive/etc/nginx/nginx.conf,v /etc/nginx/nginx.conf
===================================================================
RCS file: /etc/config-archive/etc/nginx/nginx.conf,v
retrieving revision 1.1
diff -r1.1 /etc/nginx/nginx.conf
7c7
<    worker_connections 1024;
---
>    worker_connections 8192;
49c49
<            listen 127.0.0.1;
---
>            listen 192.168.0.110:8081 backlog=8192;
55a56,61
>
>                 location ~ \.php($|/) {
>                 include fastcgi_params;
>                 fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
>                 fastcgi_pass   127.0.0.1:9000;
>                 }

$ sudo /etc/init.d/spawn-fcgi.php restart
 * Caching service dependencies ...                                                                                                     [ ok ]
 * Stopping FastCGI application php ...                                                                                                 [ ok ]
 * Starting FastCGI application php ...
spawn-fcgi: child spawned successfully: PID: 23935
spawn-fcgi: child spawned successfully: PID: 23938
spawn-fcgi: child spawned successfully: PID: 23941
spawn-fcgi: child spawned successfully: PID: 23944
spawn-fcgi: child spawned successfully: PID: 23947
spawn-fcgi: child spawned successfully: PID: 23950
spawn-fcgi: child spawned successfully: PID: 23953
spawn-fcgi: child spawned successfully: PID: 23956
spawn-fcgi: child spawned successfully: PID: 23959
spawn-fcgi: child spawned successfully: PID: 23962                                                                                      [ ok ]
$ pstree |grep php-cgi
     |-10*[php-cgi]

$ sudo /etc/init.d/spawn-fcgi.php restart
 * Caching service dependencies ...                                                                                                     [ ok ]
 * Stopping FastCGI application php ...                                                                                                 [ ok ]
 * Starting FastCGI application php ...
spawn-fcgi: child spawned successfully: PID: 24168                                                                                      [ ok ]
$ pstree |grep php-cgi
     |-php-cgi---10*[php-cgi]