ラベル Linux の投稿を表示しています。 すべての投稿を表示
ラベル Linux の投稿を表示しています。 すべての投稿を表示

2010年10月20日水曜日

OProfile コールグラフの使い方

# opcontrol --start && [filepath]
# opcontrol --stop
# opreport -c [filepath]  or  # opreport -c | grep [filename]

gcc -g でコンパイルしておけば,opannotate が使えて,プロファイリング後に
# opannotate -s [filepath]
とするとソースコード内で何行目が何回呼ばれたかが分かるっていう優れもの.

こりゃ便利.

しかし全体プロファイリングするんじゃなくてとあるアプリケーションのコールグラフだけ欲しいんだよなー.
とあるアプリケーションだけのプロファイル方法を調べなきゃ.

2010年10月19日火曜日

OProfileインストール

gprof だとマルチスレッドのアプリケーションのプロファイルがとれないという噂だったので,
OProf を使うことになりました.
OProf は gprof 同様,コールグラフもとれるし,マルチスレッドにも対応している優れものらしい.
インストール時のメモ.

まずはDownload OProfileから最新版のソースをダウンロード.

./configure をしたところ,ライブラリがいくつかないと言われた.
①configure: error: popt library not found
なので単純に yum install popt* で,poptライブラリをゲット.
(popt-devel.i386 : Development files for the popt library
popt-static.i386 : Static library for parsing command line parameters)

②configure: error: liberty library not found
yum で liberty を探しても見つからない.
ぐぐってみたら,Installing Oprofile | KernelTrapにいきついた.
そこで,yum install binutils-devel で,libertyライブラリをゲット.
(binutils-devel.i386 : BFD and opcodes static libraries and header files)

これで無事に ./congfigure → make → make install と,インストールを終えられた.

あとは
# opcontrol --start でプロファイル開始
# opcontrol --shutdown でプロファイル終了
# opreport でプロファイル結果の表示
/var/lib/oprofile/samples 内にデータが保存されていくようです.
これを変えたい場合は,--session-dir=で指定すればOK

取り急ぎここまで.

2010年7月13日火曜日

カーネル内で一定時間ごとの動作を行う

カーネル内ってnanosleepとか使えないんですね(Linux-2.6.25)
関数の定義なかった(*_*)
なので、カーネルタイマーを使って一定時間ごとに動作を行うのが良さそうです。

下のページが詳しく書いてあってすごくわかりやすかった!!
のでとりあえずメモメモ。

カーネルタイマーを使う

jiffiesが単位になるから精度は10msってことかな。(HZによるけど)

2010年7月8日木曜日

MySQLをソースからインストール

めちゃ久々の投稿.
MySQLのインストールでこけたのでメモ.

ソースDLして,./configure をした後の make で2度こけました.

1)../depcomp: line 512: exec: g++: not found
→ yum install gcc-c++ で解決

2)./include/my_global.h:988: error: redeclaration of C++ built-in type ‘bool’
→ make clean
make distclean
 した後はじめからやり直して無事 make 通りました.

ソースからインストールした場合ってアンインストールするのってどうするんだろう.
Makefileに特に記述ないぽいから,ディレクトリをがしがし消すのであっているのかな.
相変わらず謎なことだらけだな…
努力しないと.


そして make install したら
/usr/bin/install: memory exhausted
と言われた.
めっちゃメモリ残ってるのに何このエラー!
同じような状況の人が数人いたようなのですが,解決されてないのかな…困ったナ.

http://forums.mysql.com/read.php?11,224710


**7/9 追記**
configureの時にオプションで --with-low-memory をつけると解決するとありましたが,
私の場合ではそれでもだめでした.
selinuxに関するログをはいた後にこのエラーが出たので selinux を止めちゃうという対処法でとりあえずはインストールしてしまいました.

2010年1月7日木曜日

メモリ関連のメモ

カーネル内でメモリを動的に確保するために使う kmalloc と vmalloc.
あれ,これの違いはなんだろう?と思い調べる.

●kmalloc:確保するメモリをスラブから取得している
-割り当てられたアドレス空間には物理ページがマッピング済みなのでページフォルトは起きない
-アドレス空間にマッピングされているページは連続

●vmalloc:vmalloc用の領域からアドレス空間を割り当て(kmallocの拡張版)
-割り当てられたアドレス空間には物理ページがマッピングされていない場合がある
-アドレス空間にマッピングされるページは非連続

という違いがあるよう.
kmalloc により確保した領域(というかスラブが確保した領域)は /proc/slabinfo で見られるようです.
vmallocの仕組みが未だにしっくりこない…(@_@)

ということで参考ページは以下.メモメモ.
スラブアロケータ - Linuxカーネルメモ
kmalloc,vmalloc - Linuxカーネルメモ
Omicron Linux/vmalloc

2009年11月19日木曜日

システムコールの追加

Linux2.6.25カーネルにシステムコールの追加をするのでメモメモ.
ちなみにその時にx86? bit数?とかかなり初歩的なことが分かっていないことが発覚したので,それについても近いうちにまとめます.

●システムコールの追加のためにすること
1)システムコール番号の登録
2)システムコールテーブルに登録
3)追加するシステムコールのオブジェクトファイル名をMakefileに追記
4)ヘッダファイルの作成
5)システムコール本体の作成
6)カーネルの再構築

以下,詳しくやることを書いていきます.

1)システムコール番号の登録
 include/asm/unistd_32.h に
 #define __NR_システムコール名 システムコール番号
 を追加.
 /usr/include/asm/unistd_32.hにも同様に追記する
/*62bitb版OSの場合は,unistd_64.hに追記する*/
/*OSのbit数は$uname -iで調べました*/

2)システムコールテーブルに登録
 arch/x86/kernel/syscall_table_32.S に
 .long sys_システムコール名
 を追加.

3)追加するシステムコールのオブジェクトファイル名をMakefileに追記
 arch/x86/kernel/Makefile のobj-yの項目に
 システムコール名.o
 を追加.

4)ヘッダファイルの作成
4-1)カーネル空間用
 include/linux/システムコール名.h を作成

#ifndef NR_システムコール名_H
#define NR_システムコール名_H

#include <linux/unistd.h>
#include <linux/linkage.h>

#define システムコール名(arg1) syscall(__NR_システムコール名, arg1)

#endif

4-2)ユーザ空間用
 /usr/include/linux/システムコール名.h を作成
4-1で作成したヘッダファイルの#include <linux/linkage.h>#include <linux/syscall.h>に変更したものを作成する

5)システムコール本体の作成
システムコール名.cというファイルを以下のように作成し,arch/x86/kernel/以下に保存する.

#include <linux/システムコール名.h>

asmlinkage 関数型 sys_システムコール名 (引数){
 /* システムコールの内容を記述 */
}


6)カーネルの再構築
make bzImage && make install をした後に再起動!

システムコールをユーザモードプロセスから利用する場合は,ファイル内に#include <linux/システムコール名.h>を記述して利用する


これでいけるハズ

2009年9月28日月曜日

コンテキストスイッチのソースコード

今後手を加える予定なのでここにメモしときます.
(Linux2.6.25 kernel)

●コンテキストスイッチをしている箇所
 kenrel/sched.c 内 context_switch()
 switch_mm() によってプロセス空間の切り替え,switch_to() によって各種レジスタの切り替えを行っている.

●コンテキストを切り替える際に保存する情報
 task_structに格納している
  :定義は include/linux/sched.h l994
 更に,CPU依存の低レベルな実行コンテキストは thread_struct に格納している
  :定義は include/asm-x86/processor.h l315

以下はソースコードコピペ(長すぎて邪魔だったので消しましたw 09/10/15)

2009年9月17日木曜日

クロスリファレンスLXR

カーネルのソースコードを参照しやすくするために入れました.
入れ方&使い方は全てここに集約されています.
ViVa! Saborigineer. - クロスリファレンス

とりあえず使い方だけメモメモ

1.lxr/sourceにソースファイルを展開
 lxr/source/バージョン名/sourceとなるようにして作成

2.genxrefを使って、lxr/source/バージョン名/にデータベース(fileidx,xref)を作成
 $ ../../bin/genxref source/

3.fileidx、xrefのアクセス権の変更
$ chmod 644 fileidx xref

4."freetext search"、"file search"用のインデックスを作成
$ cd /var/www/html/lxr/source/バージョン名/
 $ glimpseindex -H . source
 $ chmod 644 .glimpse_*

5.versionsにバージョン名を追加
デフォルトのバージョン名を変更する場合は、defversionを変更

とり急ぎメモだけ.

2009年4月27日月曜日

Unix errno一覧

他サイトで見つけたのですが,現在とちょっと違っているようなので自分で調べてまとめてみました.
とりあえずmanページと,返ってきたエラーコードのみの少ない情報ですが(^^;)
(Fedora9 Kernel:2.6.25)

1 EPERM Operation not permitted (POSIX.1)
2 ENOENT No such file or directory (POSIX.1)
3 ESRCH No such process (POSIX.1)
4 EINTR Interrupted function call (POSIX.1)
5 EIO Input/output error (POSIX.1)
6 ENXIO No such device or address (POSIX.1)
7 E2BIG Argument list too long (POSIX.1)
8 ENOEXEC Exec format error (POSIX.1)
9 EBADF Bad file descriptor (POSIX.1)
10 ECHILD No child processes (POSIX.1)
11 EAGAIN Resource temporarily unavailable (may be the same value as EWOULDBLOCK)(POSIX.1)
11 EWOULDBLOCK Operation would block (may be same value as EAGAIN) (POSIX.1)
12 ENOMEM Not enough space (POSIX.1)
13 EACCES Permission denied (POSIX.1)
14 EFAULT Bad address (POSIX.1)
15 ENOTBLK Block device required
16 EBUSY Device or resource busy (POSIX.1)
17 EEXIST File exists (POSIX.1)
18 EXDEV Improper link (POSIX.1)
19 ENODEV No such device (POSIX.1)
20 ENOTDIR Not a directory (POSIX.1)
21 EISDIR Is a directory (POSIX.1)
22 EINVAL Invalid argument (POSIX.1)
23 ENFILE Too many open files in system (POSIX.1)
24 EMFILE Too many open files (POSIX.1)
25 ENOTTY Inappropriate I/O control operation (POSIX.1)
26 ETXTBSY Text file busy (POSIX.1)
27 EFBIG File too large (POSIX.1)
28 ENOSPC No space left on device (POSIX.1)
29 ESPIPE Invalid seek (POSIX.1)
30 EROFS Read-only file system (POSIX.1)
31 EMLINK Too many links (POSIX.1)
32 EPIPE Broken pipe (POSIX.1)
33 EDOM Mathematics argument out of domain of function (POSIX.1
34 ERANGE Result too large (POSIX.1
35 EDEADLK Resource deadlock avoided (POSIX.1)
35 EDEADLOCK Synonym for EDEADLK
36 ENAMETOOLONG Filename too long (POSIX.1)
37 ENOLCK No locks available (POSIX.1)
38 ENOSYS Function not implemented (POSIX.1)
39 ENOTEMPTY Directory not empty (POSIX.1)
40 ELOOP Too many levels of symbolic links (POSIX.1)
42 ENOMSG No message of the desired type (POSIX.1)
43 EIDRM Identifier removed (POSIX.1)
44 ECHRNG Channel number out of range
45 EL2NSYNC Level 2 not synchronized
46 EL3HLT Level 3 halted
47 EL3RST Level 3 halted
49 EUNATCH Protocol driver not attached
51 EL2HLT Level 2 halted
52 EBADE Invalid exchange
53 EBADR Invalid request descriptor
54 EXFULL Exchange full
56 EBADRQC Invalid request code
57 EBADSLT Invalid slot
60 ENOSTR Not a STREAM (POSIX.1 (XSI STREAMS option))
61 ENODATA No message is available on the STREAM head read queue (POSIX.1)
62 ETIME Timer expired (POSIX.1 (XSI STREAMS option))(POSIX.1 says STREAM ioctl(2) timeout)
63 ENOSR No STREAM resources (POSIX.1 (XSI STREAMS option))
64 ENONET Machine is not on the network
65 ENOPKG Package not installed
66 EREMOTE Object is remote
67 ENOLINK Link has been severed (POSIX.1)
70 ECOMM Communication error on send
71 EPROTO Protocol error (POSIX.1)
72 EMULTIHOP Multihop attempted (POSIX.1)
74 EBADMSG Bad message (POSIX.1)
75 EOVERFLOW Value too large to be stored in data type (POSIX.1)
76 ENOTUNIQ Name not unique on network
77 EBADFD File descriptor in bad state
78 EREMCHG Remote address changed
79 ELIBACC Cannot access a needed shared library
80 ELIBBAD Accessing a corrupted shared library
81 ELIBSCN lib section in a.out corrupted
82 ELIBMAX Attempting to link in too many shared libraries
83 ELIBEXEC Cannot exec a shared library directly
84 EILSEQ Illegal byte sequence (POSIX.1
85 ERESTART Interrupted system call should be restarted
86 ESTRPIPE Streams pipe error
87 EUSERS Too many users
88 ENOTSOCK Not a socket (POSIX.1)
89 EDESTADDRREQ Destination address required (POSIX.1)
90 EMSGSIZE Message too long (POSIX.1)
91 EPROTOTYPE Protocol wrong type for socket (POSIX.1)
92 ENOPROTOOPT Protocol not available (POSIX.1)
93 EPROTONOSUPPORT Protocol not supported (POSIX.1)
94 ESOCKTNOSUPPORT Socket type not supported
95 ENOTSUP Operation not supported (POSIX.1)
95 EOPNOTSUPP Operation not supported on socket (POSIX.1)(ENOTSUP and EOPNOTSUPP have the same value on Linux
96 EPFNOSUPPORT Protocol family not supported
97 EAFNOSUPPORT Address family not supported (POSIX.1)
98 EADDRINUSE Address already in use (POSIX.1)
99 EADDRNOTAVAIL Address not available (POSIX.1)
100 ENETDOWN Network is down (POSIX.1)
101 ENETUNREACH Network unreachable (POSIX.1)
102 ENETRESET Connection aborted by network (POSIX.1)
103 ECONNABORTED Connection aborted (POSIX.1)
104 ECONNRESET Connection reset (POSIX.1)
105 ENOBUFS No buffer space available (POSIX.1 (XSI STREAMS option))
106 EISCONN Socket is connected (POSIX.1)
107 ENOTCONN The socket is not connected (POSIX.1)
108 ESHUTDOWN Cannot send after transport endpoint shutdown
110 ETIMEDOUT Connection timed out (POSIX.1)
111 ECONNREFUSED Connection refused (POSIX.1)
112 EHOSTDOWN Host is down
113 EHOSTUNREACH Host is unreachable (POSIX.1)
114 EALREADY Connection already in progress (POSIX.1)
115 EINPROGRESS Operation in progress (POSIX.1)
116 ESTALE Stale file handle (POSIX.1)
117 EUCLEAN Structure needs cleaning
120 EISNAM Is a named type file
121 EREMOTEIO Remote I/O error
122 EDQUOT Disk quota exceeded (POSIX.1)
123 ENOMEDIUM No medium found
124 EMEDIUMTYPE Wrong medium type
125 ECANCELED Operation canceled (POSIX.1)
126 ENOKEY Required key not available
127 EKEYEXPIRED Key has expired
128 EKEYREVOKED Key has been revoked
129 EKEYREJECTED Key was rejected by service

エラーが起きたときにreturnされる値(-1など)と,errnoって違うんですね.
知らなかったです.

参考ページ:
PC覚え書き | Unix系errno一覧

2009年2月8日日曜日

IPアドレスを固定にする(Fedora9ネットワークマネージャの罠)

DHCPの設定でインストールしてしまったため,固定のIPアドレスにしなくちゃと思い,
『システム > 管理 > ネットワーク』内の『デバイス』のeth0の情報を編集.
しかしこれが謎なことに,固定のIPアドレスをちゃんと設定してeth0をリスタートしても,ネットワークにつなげません.
(LANにはつなげるのに)

また,DHCPにしてるときでも,
『システム > 管理 > ネットワーク』内の『デバイス』のeth0の情報で,
『Network Managerで管理』のチェックを外していると,
-firefoxがオフラインモードで起動する
-『コンピュータ起動時にデバイスを起動』にチェックしてるのに,起動してくれない
という迷惑なことが起きるのです……

なんでなんで?

…と思ったら記事発見.
昨日は日本語入力できなーい!って悩んでたけど,これもバグだったんですねー

【重要】『Fedora9』について

というわけで,ネットワークマネージャをサヨウナラしたところ,あっさり動作してくれました.
それにしてもぐじゃぐじゃ悩んだ…><;
デフォルトゲートウェイ?ネットワークアドレス?ブロードキャストアドレス?
全用語を確認しなおして自分のネットワークに関する浅い知識を補う良い機会となりましたw

ちなみに,このネットワークの設定は,
/etc/sysconfig/network-scripts/ifcfg-eth0ファイルに記述されてるみたい.
だから,ここを書き換えるだけでもIPアドレスの設定などが可能でした.
(BOOTPRONTOの値をdhcpからstaticもしくはnoneに変えて,IPADDR・NETMASK・GATEWAYの3つの値を登録すればOK)

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月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年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