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年5月13日木曜日

Ruby + R

統計にはRが便利!ということなので、使ってみようと思います。
最近Rubyでスクリプト書いているので、せっかくならそこで使えちゃえば楽かなと。
ということで、Ruby + R | アクトインディ技術部隊報告書を参考に。

・Rインストール
・RSRubyインストール
 −RubyからRを呼び出すため
・使い方
require 'rubygems'
require 'rsruby'

r = RSRuby::instance

r.eval_R(<<-RCOMMAND)
# 実行したいコマンド
RCOMMANDS

ちなみにRの使い方に関してはR による統計処理が便利そう。

2010年1月7日木曜日

メモリ関連のメモ

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

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

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

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

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

2010年1月6日水曜日

メモリの扱いで行き詰まり..

DATA型のbufのメモリを確保し,初期化し,ごにゃごにゃし,解放するという流れを作りたいのですが…
なんかかたまってしまう…(@_@)

#define MAXNUM 10
typedef struct
{
int now_pid;
u64 now_pmc0;
u64 now_tsc;
} DATA;
static DATA *buf;

buf = (DATA *)vmalloc(sizeof(DATA) * MAXNUM);
memset(buf, 0, sizeof(DATA) * MAXNUM);

vfree(buf);

きっと何かこのへんがおかしいんだろう….
WHERE?!?!
早く抜け出したい(>_<;)

1/7***
ちなみに
memset(buf, 0, sizeof(DATA) * MAXNUM);
の直前に
printk("buf add is 0x%08x\n",(ulong)buf);
をいれると動くっていう…(@_@)

1/8***
vmalloc ではなく kmalloc を用いれば printk を挟まなくてもうまく動きました..
vmalloc 領域の変なとこをさわっていたのかな?原因不明です..
が,とりあえず vmalloc 使うのはこわいんでやめておきます.

2009年12月5日土曜日

システム障害

最近よくシステム障害が起きているようなので,書き留めておきたいと思います.

●ロンドン証券取引所
-障害から復旧まで:
2009/11/25(英国時間) 障害発生(接続障害).取引停止.

-参照:
ロンドン証券取引所がシステム障害で取引停止 - ニュース:ITpro

●東京工業品取引所
-障害から復旧まで:
2009/11/27 障害発生.各取引を停止
 取引システムの開発・運用保守を担当するNTTデータとともに原因究明
 開発元のOMXテクノロジーにソフトの修正を依頼
 テストで動作確認
2009/11/30 システム復旧

-原因:
受け付けた注文件数が最多となった際に,潜在バグが表面化したことによる
・メモリリーク
「気配値」の計算に使うプログラムが,使用したメモリ領域を削除していなかったために生じた.
注文を受信するにつれメモリの使用可能領域が減少し,計算が不可能となった.

・フェイルオーバーの際の切り替えシステムのバグ
取引システムは現用系と待機系のホットスタンバイ方式で二重化してある.
メモリ不足を受けた際に,本番処理が待機系に自動で切り替わるはずだったが,バグによりメモリ上の一部データを正常に引き継げなかった.
その結果,待機系システムでも気配値の計算が不可能となった.

-参照:
東工取のシステム障害、原因はナスダックOMX子会社製ソフトのバグ - ニュース:ITpro

●新幹線のエクスプレス予約
-障害から復旧まで:
2009/12/3 10:00 障害発生.
 システムのサーバーを再起動し,自動改札機などとのデータの整合性や動作を確認
2009/12/3 13:00 システム復旧

-損害:
この3時間のシステム停止時間中,約1万人がシステムを利用不可能となった

-原因(12/5現在):
不明

-参照:
[続報]3時間後に復旧、新幹線のエクスプレス予約システム障害 - ニュース:ITpro


●その他(オマケ)
-秋はシステム障害の季節か:ITpro
:システム障害の詳細を開示しない企業が多いが,近年は情報公開をすることで高信頼システムを築いていこうとしている動きが多いとのこと.

こういう記事に目を通すことって大切だなぁと改めて思いました.

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>を記述して利用する


これでいけるハズ