2013/8/16にLinuxプログラムがどれだけのデータ量を扱えるか実験してみました。そのときのサンプルプログラムをWindows7の32bit、64bit双方に移植してみて、動作を比較してみます。
1.Linuxの結果(復習)
1回400kBのmallocを8017回(3GB超)でmallocエラー(メモリ不足)になりました。
2.Windows7(32bit)の結果(Visual Studio 2010)
mallocを5275回(2GB程度)でmallocエラーとなりました。Linuxでいうheapにあたるデータエリアは2GBフルに扱えるようです。
3.Windows7(64bit)の結果(Visual Studio 2012)
mallocが5225回(2GB程度)でエラーになりました???あれ、ちょっと結果が予想と違います。デフォルトのplatformがwin32(32bit)なんですね、すぐに気づきました。ビルド→構成マネージャでビルドするバイナリのplatformを指定できるので、win32→x64に変更して再ビルドして実験です。
サンプルプログラムは10,000回のfor-loopをしますが、簡単に回りきって(メモリ取得に全部成功、4GB程度のメモリを取得)しまいました。
まあほぼ予想通りの結果が得られました。ちなみに上記3つの試験を行ったPCは全部別々です。Linuxは古いPCでメモリが1GBしかなかったので、サンプルプログラムの実行に結構時間がかかりました。Swapが結構発生していましたからね。(2分くらい。swapエリアは5GB設定してあり、2.5GBほど使ってmallocエラーになります。)
一方、Windows7(32bit)でも4GB、Windows7(64bit)は6GBのメモリを搭載したPCだったのでほとんどswapは発生しません。ちなみにswapを発生させるほどWindows7(64bit)でmallocの回数を増やしたところ、処理負荷がすごいことになりマウスも思うように動かなくなってしまい、途中終了させるのにかなり時間がかかりました。あいかわらずWindowsでSwapが発生すると、動作がひどい状態になります。(最近のPCは平気で4GBのメモリもっているのが多いので気づきませんが、swapの処理の重さが更にひどくなったような気がします)
2013年9月23日月曜日
2013年8月16日金曜日
Linuxプログラムのメモリ不足
人の作ったプログラム何ですが、やたらとmalloc(正確にはcallocの方)を使ったCプログラムがありました。それの動きがどうもおかしい(不安定)なんで、見てみると数百MBのデータファイルを最初に読み込ませていました。(データファイルの大きさは、利用する状況によって変わります)動いているマシンが、RHEL6 32bitとのことなんで、明らかにmallocに失敗していると思われます。
ところが、このプログラムmallocの結果を全然チェックしておらず、catchもしていません。またプログラムを使っている人たちもLinuxに関しては素人ということで、何が悪いのか理解させるのに一苦労。試しにちょっとサンプルプログラムを作って見ました。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define MALLOC_SIZE 100000
int main()
{
int i,j;
int *pt;
for (i=0; i<10000; i++) {
pt = (int *)calloc( MALLOC_SIZE, sizeof(int));
if (pt == NULL) {
printf("## calloc error!! i= %d ##\n", i);
exit(0);
}
for (j=0; j<MALLOC_SIZE; j++) {
pt[j] = i;
}
ところが、このプログラムmallocの結果を全然チェックしておらず、catchもしていません。またプログラムを使っている人たちもLinuxに関しては素人ということで、何が悪いのか理解させるのに一苦労。試しにちょっとサンプルプログラムを作って見ました。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define MALLOC_SIZE 100000
int main()
{
int i,j;
int *pt;
for (i=0; i<10000; i++) {
pt = (int *)calloc( MALLOC_SIZE, sizeof(int));
if (pt == NULL) {
printf("## calloc error!! i= %d ##\n", i);
exit(0);
}
for (j=0; j<MALLOC_SIZE; j++) {
pt[j] = i;
}
}
}
取得したメモリに値を書き込んでいるのは、こうして実際に何か使わないと、それまでは本当にメモリの取得につながらないからです。(最初、これで苦労しました)
さてこれで実行してみるとerrorが出たときの、iの値は8,017、あれ?毎回400KB近くのメモリを取得しているはずなのに、これだと3.2GBのメモリを取得したことになっちゃうぞ?確か、Linuxだと1プロセスの最大サイズは2GB弱で、そのうちStackが1GB、Heapが700MBくらいだったはず。おおすぎます。
そこでValgrindでチェックしてみると、i=6,910 2.764GBのheap要求がされたとのこと。(計算が合う)再度、ぐぐりましたが、どうも1プロセスでのサイズ制限はなくなり、4GBのどの空間をKernel用、Stack用、Heap用に用途わけするようになったみたいです。
マシンを占有できれば大きなプログラムを動かせますが、動作解析が更にやっかいになったようです。
2013年3月9日土曜日
CentOS sudoの設定
CentOS6を使ってみてたら、コンソールでsudoコマンドで特権コマンド使おうとしたら怒られました。(もちろんパスワード入力は成功しています)
hogehoge is not in the sudoers file. This incident will be reported.
なんかsudoやるにも設定が必要なようです。/etcにsudoersというそれらしきファイルがありましたが、viで開いてみても一杯書いてあって意味が分かりません。
こんなときはググって調べます。すぐに見つかりました。
# visudo
いったんrootになって、専用のviコマンド使います。これで/etc/sudoersがviで開かれます。最下段に以下を追加。
%hogehoge ALL=(ALL) ALL
ちょっと乱暴ですが、hogehogeにsudoですべての特権コマンドを実行できるようにしました。編集と保存はviと同じです。これでsudoが使えるようになりました。
PS
その他やってたら、CentOS6って日本語入力がまだデフォルトでできない。(デスクトップ等、日本語が出てたので気づかなかった。)日本語入力しようとしてもどうしても動かない。しかたないのでまず、groupinstallで"Japanese Support"をインストールして、LANGをja_JP.UTF-8に変更。
あと日本語入力メソッドだけど、本来はscim-anthyを使うらしいんだが、まだCentOS6用にはできてないので、プロトタイプ版?ibus-anthyをインストール。しかもこれだけではだめで、ibus-setupして設定したり、/usr/bin/ibus-daemonが自動起動するようにと色々設定しないとだめでした。
hogehoge is not in the sudoers file. This incident will be reported.
なんかsudoやるにも設定が必要なようです。/etcにsudoersというそれらしきファイルがありましたが、viで開いてみても一杯書いてあって意味が分かりません。
こんなときはググって調べます。すぐに見つかりました。
# visudo
いったんrootになって、専用のviコマンド使います。これで/etc/sudoersがviで開かれます。最下段に以下を追加。
%hogehoge ALL=(ALL) ALL
ちょっと乱暴ですが、hogehogeにsudoですべての特権コマンドを実行できるようにしました。編集と保存はviと同じです。これでsudoが使えるようになりました。
PS
その他やってたら、CentOS6って日本語入力がまだデフォルトでできない。(デスクトップ等、日本語が出てたので気づかなかった。)日本語入力しようとしてもどうしても動かない。しかたないのでまず、groupinstallで"Japanese Support"をインストールして、LANGをja_JP.UTF-8に変更。
あと日本語入力メソッドだけど、本来はscim-anthyを使うらしいんだが、まだCentOS6用にはできてないので、プロトタイプ版?ibus-anthyをインストール。しかもこれだけではだめで、ibus-setupして設定したり、/usr/bin/ibus-daemonが自動起動するようにと色々設定しないとだめでした。
2012年3月2日金曜日
Linux ファイルの最大オープン可能数
Linuxにおける、ファイルの最大オープン可能数を調べたのでメモしておく。
1.ファイルオープン数
# cat /proc/sys/fs/file-nr
1395 10 76503
3つの数字が表示されますが、
左から順番に、
・今までにオープンしたことのあるファイルの最大数
・現在オープンしているファイルの総数
・オープン可能なファイル数
なお、 3個目のオープン可能最大数は以下のファイルで管理されている。
/proc/sys/fs/file-max
これをシステム起動中に、 rootでechoコマンドで書き換えてもいい。 正式にはsysconfigを書き換えてリブート。
2.あるディレクトリ下のファイル数
上記と関係するが、 プログラムである特定ディレクトリ以下のファイルをすべて開く処 理がよくある。
そのとき上限にひっかかってないか調べるため、 ファイル数を調べたいが、以下のコマンドでわかる。
$ find . -type f | wc -l
1.ファイルオープン数
# cat /proc/sys/fs/file-nr
1395 10 76503
3つの数字が表示されますが、
左から順番に、
・今までにオープンしたことのあるファイルの最大数
・現在オープンしているファイルの総数
・オープン可能なファイル数
なお、
/proc/sys/fs/file-max
これをシステム起動中に、
2.あるディレクトリ下のファイル数
上記と関係するが、
そのとき上限にひっかかってないか調べるため、
$ find . -type f | wc -l
登録:
投稿 (Atom)