2008年12月25日木曜日

プログラムの実行時間の取得

そんなに精度が必要ない場合(秒単位で良い場合)
シェルスクリプト内で,

START=`date +%s`
・・・処理
END=`date +%s`

SS=`expr ${END} - ${START}`

とすれば秒単位での値が入ります.

参考ページ:
シェルスクリプトの処理時間


精度が必要な場合は,
gettimeofdayを使用
使い方は以下のページ参照.
マイクロ秒単位での取得が可能です.

参考ページ:
Manpage of GETOFDAY
C言語:実行時間測定の方法

2008年12月24日水曜日

LD_PRELOAD in シェルスクリプト

随分更新をサボっていました…(*_*;)

この間つまって先輩に助けてもらったことを.

この間の記事で,bashだと,コマンドライン上でプログラムの前にLD_PRELOADの設定ができると記述しました.

これを,シェルスクリプト内に書くと,うまくいきません..

これは,"LD_PRELOAD=./hook.so"をコマンドとして解釈してしまうかららしい.

そこで,こういう場合は,
/bin/bash -c "LD_PRELOAD=./hook.so……"
とすることで解決できました.

2008年12月16日火曜日

メモリ使用量の制限

/boot/grub/grub.conf に追記することで簡単に可能でした.

title Fedora (2.6.25)
root (hd0,0)
kernel /vmlinuz-2.6.25 ro root=/dev/VolGroup00/LogVol00 rhgb quiet mem=1000M
initrd /initrd-2.6.25.img


これでメモリを1000MBに制限したことになります.

reboot してから
% cat /proc/meminfo
で確認できます.

参照ページ:
Linux 関係:grub.conf 起動時のメモリ - livedoor Blog(ブログ)

2008年12月15日月曜日

シェルスクリプト

冒頭に使うシェルを記述し(#!/bin/sh),実行権限を与えることで,
./hoge.shと実行することが可能.

●cnt++;の表現
 cnt=`expr $cnt + 1`
 *イコールの前後にスペースを入れない
 *'(シングルクォート)ではなく`(バッククォート)!!

●argv[1]の表現
 $1

とか色々!

シェルスクリプト3年まで使ったことなかったけど,とても便利ですね★

参照ページ:
シェルスクリプト入門
シェルスクリプト(Bash)

2008年12月13日土曜日

環境変数:LD_PRELOAD

これを用いると,プログラムの変更なしに任意の関数をフックすることができるようです.
……こわい!!笑

環境変数 LD_PRELOAD - 技術メモ帳が分かりやすかったので参考にさせていただきました.

ある関数名を定義し,それを共有オブジェクトとして指定し,プログラムを実行します.
同名関数が存在した場合は上書きすることができるため,関数のフックが可能です.

以下,やり方を.
プログラムhooktest.cを作成し,共有オブジェクトとしてコンパイル.
% gcc -fPIC -shared -o hooktest.so hooktest.c
そして環境変数に指定してメインのプログラムを実行
% LD_PRELOAD=/home/test/hooktest.so ./main
*プログラムを実行する場所と,共有オブジェクトの場所関係を考慮しなくても済ませるため,絶対パスを利用した方がいいカモ

環境変数

自分の現在使用しているシェルの確認
% echo $SHELL

BashとCシェルで色々と違いがあるようです.
●環境変数の設定の仕方
 bashの場合:export (変数名)=(値)
 cshの場合:setenv (変数名) (値)

詳細は,Linux/環境変数の設定へ.

bashでは,あるプログラム実行時のみに環境変数を設定することが可能です
% (変数名)=(値) (実行するプログラム名)

シェルを一時的にbashに変更する場合は,
% bash
とすることで可能で,
% exit
とすることで元に戻れます.

2008年12月12日金曜日

sysstat

システムの状態を監視することができるツール.
rpmで発見したのでいれてみたところ,謎なことにドキュメントしかなくてw
READMEに書いてあったページにいってダウンロードしました.
ここからsysstat-8.1.7.tar.gz
をダウンロード.
以下README通りにやってみたことを.

% tar xvf sysstat-8.1.7.tar.gz
% cd sysstat-8.1.7
% ./configure
% make && make install


インストール完了.
ここで,例えば,プロセスIDが2001のMysqlサーバを5秒ごとに20回値を見たい場合,

% ./pidstat -p 2001 5 20

とすることで,そのプロセスのユーザモード,システムモードでのCPU使用率を監視することができ,平均値まで算出してくれます.

詳細は分かりませんが,ある程度の時間監視したい場合に便利そう.

参照ページ:
sysstatで性能管理(その1)
pidstatでプロセス毎のCPU使用率を測定 | gmt-24.net

プロセスごとのCPU使用率の計算

(調べたいプロセスの使用時間) / (全体の時間)
で算出できます.

●調べたいプロセスの使用時間
/proc/(pid)/stat内の,
utime(14番目の値)+stime(15番目の値)
で算出可能

●全体の時間
/proc/stat内のCPU情報
cpu 3357 0 4313 1362393
(左から順に,ユーザーモード,低い優先度 (nice) でのユーザーモード,システムモード,タスク待ち(idle task))
を全て足し合わせた時間

*どちらの値も,積算されているものなので,同じ間隔をとって差をとる必要があります

/procの内容に関する詳細は,%man procで見られます.
この/proc以下の情報はクロック割り込みごとに値を更新します.
が,ユーザ空間から見るためには,ファイル形式になっているため,ファイルのopen,read,closeをしなければならず,多少の時間が必要です.
よって,1msや10ms間隔で見ることは無理そうです.

間隔がある程度大きくても大丈夫な場合は,調べたいプロセスに関する情報のみを追うことができる便利なツール,sysstatもあります.
詳細は次の記事へ.

全体を眺めるならばtopを利用.
ちなみにtopの更新はデフォルト5sだそうです.
オプションをつけることで更新間隔を変更することも可能です.

2008年12月10日水曜日

strcatには要注意

strcat(str1,str2)
によって文字列str1とstr2を連結することが可能です.
…が.
これは,str1にstr2をつないでいるので,str1の大きさを十分にとっておかないと,他の領域まで侵入してくちゃくちゃにしてしまうことがあります.
要注意.

参考ページ:
Manpage of STRCAT

C言語で字句解析

strtokが便利!
スペースを区切り文字として文字列bufferを区切るなら,
char buffer[1024];
strtok(buffer, " ");

とした後,strtokの戻り値がNULLになるまで,
strtok(NULL, " ")
を続ければOK.

参考ページ:
strtok…説明がとても分かりやすかったです
Manpage of STRTOK

2008年12月8日月曜日

subversion

みんなに教えてもらって,バージョン管理をすることにしました.
それとともに,今までの実験のやり方を見直し.

まず,実験マシンは書いたソースをコピーして動かすだけに.
(やりやすい様にscpを入れたシェルスクリプト作っちゃう)

NAS上でバージョン管理を.

eclipse上だと管理が楽なプラグイン(subclipse)があるとのことなので,
ついでにeclipseも最新版(ganymede)にインストール.

以下,Subclipseプラグインを参照

2008年12月5日金曜日

エイリアスの設定

つい先日,ディレクトリの中身を"rm *"で全消ししてしまいました涙
今までプログラムを書き直していたってゆう無駄…

これからはちゃんとバックアップをとろう!!と思いました.

あと,先輩のススメで,エイリアス作りました.

homeディレクトリ下の.bash_profileに,alias clr='rm *~'の記述を追加.

これでこれからは,rm *~なんて危ないコマンドを使わず,"clr"でゴミを消せることになりました!笑

参考ページ:
Linux全般編 シェルの基本操作法(後編1:エイリアスやヒストリの使い方)
Linux全般編 シェルの基本操作法(後編4:シェルの設定ファイル)

2008年12月2日火曜日

/proc ってすごい!!

システムのCPU使用率や,メモリ使用量などの情報が全て入っています.
例)
/proc/meminfo :メモリ搭載量・空きメモリ量などが記載
/proc/cpuinfo :CPUの情報が記載

また,/procディレクトリ以下には,それぞれのプロセスの情報も格納されています.
プロセスIDごとにディレクトリがあり,その中に格納されています
例)
/proc/pid/map :そのプログラムがどのアドレスを何に使っているか
/proc/pid/status :そのプロセスの名前や状態などの情報

全て情報がここを見ればわかっちゃうわけですねー!
すごい.

今得たいのは,それぞれのプロセスの情報なので,
/proc/pid/statを見ればOKなようです.

参考ページ:
/procによるLinuxチューニング
Manpage of PROC

2008年12月1日月曜日

三項演算子が二項?

perfctrの中にあるglobal.cで謎な記述がありました.
info.tsc_to_cpu_mult ? : 1
三項演算子っぽいのに条件の後ろの値が1つしか値がない.

これは,条件部分の値がfalseでない場合は,その値を返り値とし,
falseならばセミコロンの後ろの値を返す,ということらしい.

つまり,ここは,
info.tsc_to_cpu_mult ? info.tsc_to_cpu_mult : 1
ってことですね.

2008年11月29日土曜日

2008年11月27日木曜日

Rubyのインストール

スクリプトを作るのにRubyを使ってみることにしました.
昔まつもとさんの講演を聞きに行って,最も自然言語に近いスクリプト言語ということで興味があったので.

ここからダウンロード

Ruby Install Guideを参考にインストール

以降,そのページにありますが,一応やったことをメモ.

% tar xvf ruby-1.8.7-p72.tar.gz
% cd ruby-1.8.7-p72
% ./configure
% make
% su
# make install
# exit
% make clean


デフォルトでは/usr/local 以下にインストールされるようです.

% ruby -v
とすると,バージョンが表示され,ちゃんとインストールできていることが確認できました.

よーし,初Ruby挑戦♪♪

公式ページのチュートリアルはプログラミング初心者向けで読みやすいですw

2008年11月25日火曜日

リアルタイムプロセス

プロセスをリアルタイムプロセスにするには,sched_setschedulerを用いる.

sched_setscheduler(pid_t pid, int policy,const struct sched_param *param);

pid:プロセスID(自身をリアルタイムプロセスにするには0を設定)
policy:どのようなスケジューリングに設定するかのポリシー
(リアルタイム:SCHED_FIFO,SCHED_RR
リアルタイムでない:SCHED_OTHER,SCHED_BATCH,SCHED_IDLE)

●使用例:より正確に時間を計測したい場合
#include
struct sched_param *param;

int main(){
 ……
sched_setscheduler(0,SCHED_RR,param);
sleep(sleep_interval);
sched_setscheduler(0,SCHED_OTHER,param);
 ……
}

参照ページ:
Manpage of SCHED_SETSCHEDULER

2008年11月23日日曜日

ファイルの中身を検索する

「この構造体どこに定義してあるのッ(怒)」というときのために.

shell> grep -r 文字列 *
これで全ファイル内から文字列を検索できる.

特定のファイルから文字列を検索するには,
shell> grep 文字列 ファイル名
でOK

2008年11月22日土曜日

精度の高いSLEEP

sleep関数では,秒単位でしかsleepのインターバルを指定できません.
更に精度の高いsleepを使用したい場合には,usleepとnanosleepの2つがあります.
usleepは今はあまり推奨されていないようなので,一般的にはnanosleepのよう.
カーネル2.4系ではこの関数をリアルタイムプロセス内で使う必要があったようですが,今現在はその必要はないとのこと.

参照ページ:
Manpage of USLEEP
Manpage og NANOSLEEP

2008年11月19日水曜日

CPUの情報

shell> cat /proc/cpuinfo
でCPUのコア数などが表示される

使用するCPUの数の制御

マルチプロセッサのコア数を減らすためには,BIOSで設定が必要.
だと思っていたのですが,
使用するCPUの数を減らすには
% echo 0 > /sys/devices/system/cpu/cpu1/online
でCPU1を,不使用にできる.
元に戻したい場合は/sys/devices/system/cpu/cpu1/onlineの値を1に直せば良い.
他CPU2,CPU3なども同じように設定することで制御可能.

すごい便利!

ちなみにrebootする度に値は1になります.

/*** 追記(2008/11/28)
これは,スケジューリングをするときにこのonlineの値を見てそのCPUを使う/使わないを判断しているためだろうとのこと.
だからrebootなどが必要ないのですね.
他にもCPUのfrequencyなどもここで制御できるようで,省エネのためなのでは,と先輩が言っていました.
***/

2008年11月17日月曜日

Linux Performance Counters Driver

PAPI(前日記参照)を用いてシステムワイドな値がとれないということが発覚しました…
PAPIはあくまでもプログラムごとのハードウェアカウンタの値を見るもので,このプログラムだとキャッシュミスが多いな…などといったことを発見し,プログラムのチューンアップを行うもののようです.

しかし,PAPIをインストールした際に,kernelにパッチをあてた,
Linux Performance Counters Driver(perfctr)を利用すれば,システムワイドな値がとれる様子.

しかしこれ,ドキュメントがない!
ので,ソースを見て解読するしかないっぽいです

とりあえずサンプルコードはあるので,真似して使えるようにならねば.

2008年11月13日木曜日

su と su- の違い

スーパユーザになるときのコマンド,「su」に関して.
ハイフンをつけない/つけるで,コマンド実行前のユーザーアカウントの操作環境を引き継ぐか,root仕様にするかが変わるみたいです.
(知らなかったー!気まぐれだと思ってました笑)

・su の場合
 rootになったときに,ユーザアカウントの動作環境を引き継ぐため,
 ・ディレクトリが移動しない
 ・環境変数が一般ユーザのまま
  →一般ユーザのデフォルトのPATHには"/usr/sbin/"が含まれていないため,実行時にパスを付けて実行しなければならない

・su - の場合
 rootになったときに,rootの動作環境を用いるため,
 ・ディレクトリが"root"になる
 ・環境変数がroot仕様になる
  →PATHに"/usr/sbin/"が含まれている

だから,なるべくハイフンをつけた方がいいような気がしますね.

2008年11月4日火曜日

PAPIのインストール

PAPI:Performance Application Programming Interface
ハードウェアカウンタを見ることができるAPIです.

まずはここから最新版をダウンロード.

INSTALLガイドを見ると,カーネルにパッチをあてる必要があるようで.
(Linux/x86)

●kernel●
まずは,カーネルをダウンロード.
パッチのバージョンと合うように,今回は2.6.25をダウンロード.
/usr/src/kernels内に展開.
そのディレクトリに移動.
shell> cp ../linux-2.6.23/.config .
-今まで使っていた.configファイルをディレクトリ内にコピー
shell> make mrproper
 -お掃除
shell> papi-3.6.2/src/perfctr-2.6.x/update-kernel
-perfctr(Performance Monitoring Counters Driver)をカーネル内に入れるためのパッチあて
shell> make oldconfig
-さっきコピーしたconfigファイルを引き継ぐ
shell> make menuconfig
-更にinstallガイドの沿って設定を行う("PERCESSOR TYPE AND FEATURES"内のPerformance MoniteringをMにして,中のものに全てチェックをつけるetc)
shell> make bzImage
 -bzImageというカーネルイメージを作成
shell> make modules
-モジュール作成
shell> make modules_install
-/lib/modules/下にモジュールがインストールされる.
shell> make install
-/boot/以下にカーネルイメージなどが作成される.

ブートローダの設定
/etc/grub.confのdefaultの値を1から0に書き換えることで,デフォルトで起動するカーネルイメージを変更できる.
(/etc/grub.confに新しく入れたカーネルのバージョンが書き足されているため,default値は,0から1に変わっているので)

で,reboot!!
2.6.25で起動します.

●Dynamic /dev (udev)●
Linuxのいろんなバージョンに適合させるための作業
papi-3.6.2/src/perfctr-2.6.x/下で行います
shell> cp etc/perfctr.rules /etc/udev/rules.d/99-perfctr.rules
-perfctrがカーネルにロードされたときに,udevが,全ユーザのアクセスできる/dev/perfctrを作成するためのルールを追加
shell> cp etc/perfctr.rc /etc/rc.d/init.d/perfctr
 -カーネルがperfctrモジュールを自動で呼ぶことを可能とするためのスクリプトを追加
shell> chmod 755 /etc/rc.d/init.d/perfctr
shell> /sbin/chkconfig --add perfctr
 -perfctrという新しいシステムサービスを追加(詳細は@IT)

rebootする.

shell> papi-3.6.2/src/perfctr-2.6.x/examples/perfex/perfex -i
とすると,
なんだかOKそうな値がちゃんと出ました!!
PerfCtr Info:
abi_version 0x05020501
driver_version 2.6.35 DEBUG
cpu_type 18 (Intel Core 2)
cpu_features 0x7 (rdpmc,rdtsc,pcint)
cpu_khz 2394142
tsc_to_cpu_mult 1
cpu_nrctrs 5
cpus [0,1,2,3], total: 4
cpus_forbidden [], total: 0

基礎作り終了.

●PAPIインストール●
papi-3.6.2/src/下で行う
shell> ./configure
shell> make
shell> make test
-テストを1つ行う.良い結果が出たら次へ.
shell> make fulltest

PAPIインストール終了ー!
次は,doc/下のUSER'S GUIDE見たりして使い方のお勉強です.

2008年11月3日月曜日

Linuxインストールしました

やっとこさ家のパソコンに.

謎にfirefoxが「Could not find compatible GRE between version 1.9b and 1.9b」というエラーを出して起動しなくなった.
xulrunnerというランタイムパッケージとのバージョンが合わなくなったって意味らしい.
色々探したけどイマイチよく分からなかったので,単純にyumでfirefoxをアップデートしてみた.
そうしたら,問題なくあがるようになった笑
謎.

Fedora9は,標準インストールでは日本語入力できないみたい.
Fedora 9で日本語を入力するには - @IT
この設定を終えて一度ログアウトしたらちゃんと使えるようになった♪
これで,ctrl + space キーでも,半角/全角キーでも日本語入力ができるようになりました.

分からないことだらけだなぁ(*_*;)

Hardware Counter Driven On-the-Fly Request Signatures

ASPLOS'08の,Kai Shenさんたちの論文です.
ハードウェアカウンタの値を用いて実行中のリクエストを早期識別しちゃおう!というスゴイ話.
ゼミでやったので詳しめにまとめ.
(先輩方に色々フォローしてもらって勉強になりました!もっとしっかり読めるようになりたい)

●背景&問題点●
OSは,実行時のワークロードのプロパティを知ることで,より良いスケジューリングが可能になったり,コストを抑えたNWサービスが可能となる.
しかし,現状では,過去のリクエストからワークロードのプロパティを予測する手法がとられている.
この手法では,入力パターンが多く,実行時の状態が変化するワークロードの予測を当てることは難しい.

●提案●
サーバリクエストを実行中の早い段階で識別し,プロパティを予測しよう.
 -プロパティとは:メモリ使用量,CPU使用量,I/O発行量など
この,リクエストの識別は,ハードウェアカウンタの値を数個組み合わせてシグネチャとすることで可能となる.

●ハードウェアカウンタの組み合わせ●
レジスタにマップできるハードウェアカウンタの数はプロセッサにより限られているため,数個選ぶ必要がある.
選ぶ際には,以下の3つに注意.
1.正規化の種類(time-based or progress-based)
 全てのハードウェアカウンタを両方で正規化し,相関係数が高い値になった方を採用する.
 調査の結果,イベントカウント数が関わる値はprogress-based,持続時間が関わる値はtime-basedが適していることが分かった.
2.環境の影響
 リクエストを並列に実行した場合の相関係数は,全ハードウェアカウンタの値で低くなっているが,その中でもなるべく影響を受けないもの(*)を採用する.(L2Refferenceなど)
 *L2キャッシュ・メモリアクセスに関わる値は,コンテキストスイッチの影響を大きく受けるため,避けたい
 *L1キャッシュ・トレースキャッシュ・TLBのイベント関連は,ハイパースレッディングの機能を持つ場合に,これらの機能を共有するために不安定な値をとるため,避けたい
3.アプリケーションによる違い
 サーバアプリケーションの種類によって効果のあるハードウェアカウンタが異なるため,それぞれのアプリケーションごとに適切なハードウェアカウンタを選ぶ必要がある.

●値の収集とリクエスト識別●
1.ハードウェアカウンタの値はインクリメントされるため,定期的に値を取り出し,その差を収集する.
2.収集したいくつかの値をシグネチャとし,そのリクエストのプロパティとの対応表を作成する.
3.対応表の値と実行中のハードウェアカウンタの値の差により,リクエストを識別する.
 -リクエスト実行してからある一定時間で識別を行う方法と,対応するリクエストが見つかるまで時間を増やして識別を行う方法の2種類がある.

●実験●
4つのサーバアプリケーションで実験した.
―TPC-C,TPC-H,RUBiS,Index search(最初の3つはCPU-bound, その他はI/O-bound)
CPU使用量,I/Oサイズの予測の正確性を評価したところ,並列実行でも7%,3%,20%,40%と非常に低いミスを実現.
RUBiSやIndexsearchは,初めに同じような経路を辿るために他と比べて識別が難しくなっているが,TPCの2つに関しては,リクエスト実行の非常に早い段階で正確な識別ができている.

●応用例●
1.効果的なスケジューリングの実現
 この提案手法を用いてレディータスク内で最も残り時間が短いタスクをキューの先頭にもってくることで(SRPTスケジューリング),デフォルトのスケジュールに比べ70%以上応答時間の削減に成功した.
2.異例なリクエストの検出
 似たリクエストでクラスを作り,リクエストを早期に分類することで,SQLインジェクションなどの異例なリクエストの検出が行えた.


…ちょっとはしょったつもりが,詳しく書きすぎたかもw
長いw

2008年10月30日木曜日

MySQLのインストール

今日から実験マシンを使うぞ!ということで.
また環境作りからリスタートです.
まずはLinuxにMySQLをインストール.

MySQL5.0をダウンロード.
MySQL-Red Hat Enterprise Linux 5 RPM (x86) downloads
ここから"Server","Client","Headers and libraries"の3つをもってくる.
解凍しようとしたら,perl(DBI)がなかったため,yumでperl-DBIをいれた.
インストールは全てroot権限で行います.

1. Serverのインストール
shell> rpm -ivh MySQL-server-community-5.0.67-0.rhel5.i386.rpm
shell> mysql_install_db
shell> /usr/bin/mysql_secure_installation
ここで,パスワードの変更や,匿名のアクセス制限や,権限テーブルの設定など聞かれるので答えて…
shell> /etc/init.d/mysql status
とやると,MySQLServerが起動していることが確認できます.

2.Clientのインストール
shell> rpm -ivh MySQL-client-community-5.0.67-0.rhel5.i386.rpm

3.Headers & Libraliesのインストール
shell> rpm -ivh MySQL-devel-community-5.0.67-0.rhel5.i386.rpm

4.確認
ユーザ権限になって,
shell> mysql
とすると,ちゃんとMySQLが起動することが確認できます.

後の設定は,MySQLでできるはず...

Linuxのバージョンを調べる

コンピュータのシステム情報を表示するコマンドで,unameがあるので,それで見られるかと思いきや,
shell> uname
とすると,表示されるのは「Linux」だけ.
Linuxのバージョンを調べるには,
shell> cat /etc/redhat-release
としてファイルの中身を見るしかないみたいです.

2008年10月18日土曜日

MySQL + TPC-H(3)

結局,最初のところで間違えてたのが原因でした(^^;)
DBGENとQGENのmakefileを作成したところで,MySQL用に記述をするのが必要でした.
これは,TPC-Hで記述しました.

これをmakeし直したら,tpch-run.pyは,qgenの場所やdbgenの場所,mysqlのコマンドなど,最初の方に値を設定するだけでちゃんと動きました(^-^)/
/***追記(2008.10.19)
あと,randomseedの値が大きすぎるとqgenが動かなかったので,これもranomseed=1の方を利用しました.
MySQLの場合は,set rowcountをLIMITで表しているため,tpch-run.py内のset rowcountで検索しているところをLIMITに書き換える必要もありました(496行目)
***/

さてさて,ログを見てみると…
Q1とQ13以外はちゃんとエラーなく実行できたっぽいです!

ということで,Q1とQ13はもともとあったファイルをいじっちゃおうと.
q1.sqlは,(3)を消したらOK.
q13.sqlは,何がだめなのか謎です…
select
c_count,
count(*) as custdist
from
(
select
c_custkey as c_costkey,
count(o_orderkey) as c_count
from
customer left join orders on
c_custkey = o_custkey
and o_comment not like "%special%packages%"
group by
c_custkey
) as c_orders (c_custkey, c_count)

group by
c_count
order by
custdist desc,
c_count desc;

ただいま検討中...

でもほんとにこれに手を加えるので合ってるのかなぁ…?

<追記>2008.10.19
この,もともと22個あったSQLファイルをMySQL用に書き換える方法は合ってるようです.
しかし,調べたところ,Q13は,as c_orders (c_custkey, c_count)という文法に対応してないため,サブクエリ内にasを入れるとあるのですが,これをやってもうまくいきません..
謎.謎.謎.

<追記>2008.10.20
解決しました(>w<)/
DBT-3 version 1.9 MySQL5.0への移植作業報告書の5.2.サブクエリの実施結果に対するエイリアス名指定文法の修正 (移植)を参照!
from ( select
c_custkey, count(o_orderkey) as c_count
from
customer left outer join orders on
c_custkey = o_custkey and o_comment not like '%:1%:2%'
group by
c_custkey
) as c_orders

やっぱりMySQLはas c_orders (c_custkey, c_count)という文法に対応していませんでした.よって赤字のように修正したところ,動いたー!
やった(>w<)/♪

うまくいった気がするぞぉ…

2008年10月15日水曜日

MySQL + TPC-H(2)

似てるから用語確認.
mysqld:MySQLサーバ
mysql :SQLステートメントを実行するためのコマンドラインクライアント

今日は,tpch_run.pyを動かそうっと.
まずは,MySQLにPythonでアクセスするためのインターフェース(MySQLdb)をここからダウンロード.

しかもなんだか,mysql_configもないと言われた.

ので,まずはMySQLのサイトから,"Libraries and header files"を持ってきてインストール.
mysql_config発見(^-^)/
/usr/bin/mysql_config

*MySQLdbのインストール(READMEに沿って)
1.解凍&移動
shell> tar xfz MySQL-python-1.2.2.tar.gz
shell> cd MySQL-python-1.2.2

2.site.cfgの設定を変更.
 mysql_config = /usr/bin/mysql_config
 を追加.

3.setup.pyの中身を書き換える.
 mysock,mysql_cmd,mysql_queryの値を適切なものに変更.
 dbgen_dir,qgenの値にそれぞれの場所を設定.
 AUDIT_DIRが設定されていなかったので,環境変数に追加.
 shell> setenv AUDIT_DIR "/tmp"
  →ここにTPC-Hを動かした結果が保存されるみたい.

4.セットアップ
shell> python setup.py build
 shell> python setup.py install

5.動かしてみる!
 shell> python tpch_run.py -p -s 1 --leave_server_up

とりあえず,動いたっぽいので今日はこのまま放置してバイト行きまする.

*今日学んだこと*
インストールはrootでするべき!
先輩方,お世話になりましたm(_ _)m

2008年10月10日金曜日

MySQL + TPC-H(1)

とりあえず進んだところまで.

TPC-H

ここで,データベースとクエリを作成するツールの利用が可能となりました.

その後のMySQLとの連携なのですが,先日先輩に教えていただいたページから,コレをダウンロードします.

README通りなのですが…以下やってみたことを.

1.データを作成.
shell> dbgen -s 10
→"*.tbl"というファイルが,8つ作成されます.
 sで指定する数はスケール.単位はGB.

/****追記(2008.10.19)
1.5.myisam_tpch_create_table.sqlの中身が間違っていたようなので書き換えが必要
TPCHの仕様書の12ページにあるような順番でテーブルを作成する必要があります.
が,このsqlのファイルは順番がめちゃくちゃになっていたので,順番を入れ替える必要があります.
だから今まで結果が全部Empty setだったんですね(^^;)
追記****/

2.スキーマの作成:tpch100Gというデータベースを作成し,そこにテーブルを作成
shell> mysql -u ユーザ名 -p -e "create database tpch100G"
shell> mysql -u ユーザ名 -p tpch100G < myisam_tpch_create_table.sql
→確認.
mysqlにログインし,
mysql> use tpch100G /* 利用するデータベースをtpch100Gに切り替えた */
mysql> show tables;
とすると,8つのテーブルが作成されていることが確認できます.

3.load_mysql.shの中を書き換え
/* 1で作成したテーブルが入っているフォルダを指定 */
PATH_DATA=/hoge/tpch/tables
/* データベース名指定 */
DATABASE=tpch100G

mysql…の文を全て,
mysql -u ユーザ名 -pパスワード -S MySQLのソケット $DATABASE -e…
と書き換える.

*この-pパスワードは間にスペースが入ってはだめなことに要注意!!
MySQLのソケットは
shell> mysqld --verbose --help
とすることで,サーバパラメータの一覧が出てくるので,確認できました.

/****追記(2008.11.07)
新しい実験環境でこのシェルの実行に失敗しました.
load_mysql.sh内に以下の赤字を追加することで回避できました
LOAD DATA LOCAL INFILE '$PATH_DATA/$i.tbl' INTO TABLE $i FIELDS TERMINATED BY '|'
"LOCALが指定されていない場合、ファイルはサーバホスト上に存在しなければならず、サーバによって直接読み取られなければなりません"
(BY MYSQLのリファレンス)
追記****/
3.シェルスクリプトを用いてデータをロード.
shell> chmod u+x load_mysql.sh
shell> ./load_mysql.sh

これで無事にテーブルにDBGENで作成したデータが入れられました><♪

次はStartup mysqlからです(^-^)/

2008年10月8日水曜日

MySQL

を使おうとしています.

とりあえず,ユーザ登録とデータベースの作成からスタート.

1.パスワードを持たない匿名ユーザの削除.
rootでも,userでも,
shell> /usr/bin/mysql_secure_installation
としたときに,
Remove anonymous users? [Y/n]
と聞かれる部分があるので,そこで「Y」を選択することで匿名ユーザを削除できます.
MySQLにログインして,
shell> mysql -u root -p
Enter password:********

mysql> FLUSH PRIVILEGES;
 権限テーブルの再読み込みを行うコマンドらしい.
 これをしないと,サーバを再起動するまで、変更内容が反映しないとかなので,絶対必要.

2.rootと同じ権限を持つユーザの登録.
mysql> GRANT ALL PRIVILEGES ON *.* TO ユーザ名@"%"
-> IDENTIFIED BY 'パスワード' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO ユーザ名@localhost
-> IDENTIFIED BY 'パスワード' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

 これで,*.*(全てのデータベース.全てのテーブル)上で,全ての権限を持つユーザを登録という意味.
 2行やることで,%(すべてのホスト)のユーザ,ローカルホストのユーザどちらも登録したことになるようです.

3.確認!
mysql> SELECT Host, User, Password FROM mysql.user;

 これで今登録されているユーザが全部見えます.

4.データベース作成
mysql> create database データベース名

 もしくは,mysqlにログインしていなくても,
shell> mysql -u root -p -e "create database データベース名"
 でもOK.
 この,-eというオプションで,コマンド実行できるみたい.

とゆうことで,初歩ですが,今日はMySQLとたわむれてました.w

明日は,TPC-HとMySQLの連携を再び試みてみようかな.
論文も読まなきゃ!
同期に論文読みの鬼がいるから見習わないと…w

/*追記−MySQLデータベースをインポートする*/
1.データベースを作成する
mysql> create database データベース名
2.エキスポートしていたダンプファイルをデータベースにいれる
root# mysql -p データベース名 < ダンプファイル名

2008年10月3日金曜日

結局…

TPC-Hが何なのか,どーやってMySQLと関連づけて動かすのか謎すぎて,
先輩にヘルプしました.
だめすぎる(;_;)

色々見てみたサイト.
TPC-Hの公式ページ
TPC-H Run on MySQL 5.1 and 6.0
WindowsServerのTPC-Hの結果
 →ここに,「標準化されたレポート生成のパフォーマンスは、別の TPC-R ベンチマークで実証します。」ってあるのも謎.

まだまだひよっこすぎてだめだなぁ..
あと,体調管理はしっかりしなきゃだめだなっと反省..

論文読もうっと.

2008年10月2日木曜日

TPC-H

さて,研究の環境作り中なんですが…
これがまた分からないことだらけです(;_;)

今はTPC-Hというベンチマークを使ってみようという…
これが全く英語の資料ばっかりで.

とりあえず分かったことは,
TPC-Hのサイトの右下のところから,DBGEN and QGENをとってくると.
どうも,これでデータとクエリを勝手に作ってくれるみたいです.

makefile.suiteをコピーしてmakefileを作成.
とりあえず,

CC = gcc
DATABASE= SQLSERVER
MACHINE = LINUX
WORKLOAD = TPCH

としてみたところ,makeによりコンパイルができました.
……これは間違い^^;
追記の追記参照.


仕様書のサンプルの通り,./dbgen -s 1としてみたら,"hoge.tbl"がいくつかできた.


でも,あれ?どうやってMySQLの中にテーブルとして入れるんだろう?


明日先輩にヘルプします.涙


<追記>
…と思ったら!!
なんとも親切そうなページを発見しました★
明日はこれを参考にやってみよう(^-^)/♪
Brett Schroederさんのブログ
わーい♪


<追記の追記>2008.10.18
makefileはちゃんとMySQL用に書くべきでした.

CC = gcc
DATABASE= MYSQL
MACHINE = LINUX
WORKLOAD = TPCH

として,tpcd.hに,
#ifdef MYSQL
#define GEN_QUERY_PLAN "EXPLAIN"
#define START_TRAN "START TRANSACTION;\n"
#define END_TRAN "COMMIT;\n"
#define SET_OUTPUT ""
#define SET_ROWCOUNT "LIMIT %d\n"
#define SET_DBASE "USE %s\n"
#endif /* MYSQL */
と追記.

2008年10月1日水曜日

ブログ開設

大学4年生の後期になりました.

全く知識のない私にとって,毎日わからないこと&新しい発見だらけです.
ので,ブログにメモ代わりに書きためることにしました.

***目標******************************************
・平日は毎日更新すること
 ⇒なまけものの私も毎日ちゃんとやるかな
・もっと社会に詳しくなること
 ⇒もう大人だから☆
・英語を勉強すること
 ⇒スラスラ読んで理解できるようになりたい
・規則正しい生活
 ⇒あんまし関係ないかなw
**************************************************

というわけで,頭が弱いので,レベルが低いと思いますが,
日々精進したいです★

何か気付いたことがあったら,コメントよろしくお願いします♪