「*[linux]」の検索結果を表示しています
2012-12-29

[] Linux Mintアップグレードしてみた

つい先程、13 Maya から 14 Nadiaへとアップグレードして、多少トラブったのでメモ


http://www.mk-mode.com/octopress/2012/12/05/05002021/

方法はここにある通り、Debian系のいつもの"/etc/apt/sources.list"を変更してdist-upgrade。

Debianと違うのは、変更する名前が2つあること。どうもUbuntuのパッケージも使っているようだ。

ということは、Debaina/Ubuntuとは違い、Ubuntuのパッケージがそのまま使えるということかな?


でトラブルはネットに繋がらないこと。正確にはDNSが見れないよう。

ひとまず、昔見た http://www.opendns.com/ を利用させてもらう。

これを"/etc/resolv.conf"に設定すれば治った。

208.67.222.222
208.67.220.220

追記:

デュアルディスプレイの片方にマウスが移動しない問題。

原因は不明だが、"NVIDIA X Server Settings"で、TwinViewにして逃げた。

これだと左右のディスプレイが独立していないのが辛いんだが、しょうがない。

2012-01-02

[] Ubuntu11.10でSynergy自動起動する方法

去年の末にさすがに古くなって限界が来ていたUbuntuマシンを11.10で再インストールしたのですが、"/etc"以下とか色々変わりすぎていて悪戦苦闘しています。

そして悪戦苦闘の1つに愛用しているSynergy自動起動があります。


いままでは、"/etc/gdm/"以下に色々設定していたのですが"/etc/gdm"ディレクトリが無い。強引にディレクトリを作って設定してもダメ。

調べたらログインマネージャがGDMからLightDMに変わっていたのが原因のようです。

GDMをインストールしても良いのですが、調べたらLightDMでも自動起動できました。日本語サイトでは検索しても見た限りでは見つからなかったのでメモしておきます。


ログイン画面でSynergy自動起動する方法

例えばsynergycを起動する場合には"/etc/lightdm/lightdm.conf"に以下の行を追加します。IPアドレスは適時修正してください。

synergysは試していませんがsynergycの部分を修正すれば良いはずです。

greeter-setup-script=/usr/bin/synergyc 192.168.1.2

ログイン後にSynergy自動起動する方法

これですが、手っ取り早いのはウィンドウマネージャ側(GNOMEKDE等)で設定するのが楽なようです。

"/etc/lightdm/lightdm.conf"に同様の設定があるのかも知れませんが、ちょっと分かりませんでした。

2011-05-29

[] プロセス最大数はKernelではどうなっている?

昨日の続き


昨日はユーザランドで値が取得出来た。

sleep sortのアルゴリズムの問題点はプロセス数にかかっている。

なぜならsleep sortは同時にプロセスを起動しないといけないから。

もちろん工夫すれば、プロセス数が少なくても工夫は出来るけどそれはとりあえず置いておく。


さて、昨日の結果で気になる事がある。

メモリサイズ関係もほぼunlimitedになっている。

プロセスはfork()あたりで起動するが、内部的には現在のプロセスをコピーすることになる。

fork()で使用メモリ量を少なくする技術も使われているが、メモリを使う事には代わりが無い。

ということはプロセス数がunlimitedに設定されていても問題があるのは確かだ。

最悪設定なければ、メモリを食いつぶしてkernelまきこんで死ぬんだろうか?


という前置きをしてカーネルではどうなっているか調べてみた。

まずは見るべきはfork()のKernel側のソースだろう。

glibc側で処理する機能では無くkernelの機能を直接使っているはずなので放っておく。


fork()がどこかと言えば、kernel/fork.cに存在する。

関係しそうな所をあげてみよう。

void __init fork_init(unsigned long mempages)
{
#ifndef __HAVE_ARCH_TASK_STRUCT_ALLOCATOR
#ifndef ARCH_MIN_TASKALIGN
#define ARCH_MIN_TASKALIGN	L1_CACHE_BYTES
#endif
	/* create a slab on which task_structs can be allocated */
	task_struct_cachep =
		kmem_cache_create("task_struct", sizeof(struct task_struct),
			ARCH_MIN_TASKALIGN, SLAB_PANIC | SLAB_NOTRACK, NULL);
#endif

	/* do the arch specific task caches init */
	arch_task_cache_init();

	/*
	 * The default maximum number of threads is set to a safe
	 * value: the thread structures can take up at most half
	 * of memory.
	 */
	max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);

	/*
	 * we need to allow at least 20 threads to boot a system
	 */
	if(max_threads < 20)
		max_threads = 20;

	init_task.signal->rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;
	init_task.signal->rlim[RLIMIT_NPROC].rlim_max = max_threads/2;
	init_task.signal->rlim[RLIMIT_SIGPENDING] =
		init_task.signal->rlim[RLIMIT_NPROC];
}

static struct task_struct *copy_process(unsigned long clone_flags,
					unsigned long stack_start,
					struct pt_regs *regs,
					unsigned long stack_size,
					int __user *child_tidptr,
					struct pid *pid,
					int trace)
{
	//省略
	retval = -EAGAIN;
	if (atomic_read(&p->real_cred->user->processes) >=
			task_rlimit(p, RLIMIT_NPROC)) {
		if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE) &&
		    p->real_cred->user != INIT_USER)
			goto bad_fork_free;
	}
	//省略
}

long do_fork(unsigned long clone_flags,
	      unsigned long stack_start,
	      struct pt_regs *regs,
	      unsigned long stack_size,
	      int __user *parent_tidptr,
	      int __user *child_tidptr)
{
	//省略
	p = copy_process(clone_flags, stack_start, regs, stack_size,
			 child_tidptr, NULL, trace);
	//省略
}

RLIMIT_NPROCが実際に使われている部分とそれに関係する部分を抜き出してみた。

fork_init()とcopy_process()で使われている。copy_process()はdo_fork()から呼ばれている。

task_rlimit()は単なるデータ取得のinline()関数なので放っておく。

つまり実際重要なのはfork_init()だけ。まあ内容はmax_threads/2に設定しているだけ。

結局unlimitedでもkernelではきちんと制限を儲けていると。

ちなみに、fork_init()はinit/main.cから呼ばれている。つまり、kernelが起動時の初期化関数。


で、fork()は現在はNPTLスレッド実装の一部として提供されているので(manやglibcを参照)、結局スレッド最大数を見れば良いんだとおもう。(未確認)

これは/procで確認できる。

$ cat /proc/sys/kernel/threads-max
63311

まあ、遊びでsleep sortを使う分には問題ない数です。

2011-05-28

[] 最近のプロセス最大数

sleep sortを「常識を覆すソートアルゴリズム!その名も”sleep sort”! – Islands in the byte stream」で知ったのが切っ掛けでふと、プロセス最大数は幾つだっけとか思ったので調べてみたメモ。

ちなみにDebian環境。


これulimitで簡単に分かります。

max user processesってのがそれで、どうもunlimitedなのでメモリが許す限り起動できそう。

ちなみに、manすると分かりますが、ulimitは実はbashの内部コマンドです。

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

これプログラム的にどうやっているかと言えば、getlimit(2)を使用しているはず。

#include <stdio.h>
#include <sys/time.h>
#include <sys/resource.h>

int main(void)
{
	int ret;
	struct rlimit rlim;

	ret = getrlimit(RLIMIT_NPROC, &rlim);
	if (ret < 0) {
		return 1;
	}

	if (rlim.rlim_cur == RLIM_INFINITY) {
		printf("soft:nolimit\n");
	}
	else {
		printf("soft:%d\n", rlim.rlim_cur);
	}
	if (rlim.rlim_max == RLIM_INFINITY) {
		printf("hard:nolimit\n");
	}
	else {
		printf("hard:%d\n", rlim.rlim_max);
	}

	return 0;
}

$ ./hoge
soft:nolimit
hard:nolimit

昔は設定されてた覚えがあるんだどなぁ。

最近は設定されていない項目が多い。

そういえば、かなり昔にcoreがデフォルトで作られなくなってビックリした記憶がある。

2011-05-15

[] ロードアベレージをC言語で取得してみる

aptをいじっていた流れでgetloadavg(3)というのがあるのを知ったのでメモ。

まあ、だからどうしたという内容だけど、存在自体知らなかったしブログのネタが無いので書いただけです。


ソースは下のサイトのをほぼ、そのまま使用。

http://blogs.oracle.com/yappri/entry/loadavg

#define _BSD_SOURCE
#include <stdio.h>
#include <stdlib.h>

int main(void) {
	double loadavg[1024];

	getloadavg(loadavg, 1024);
	printf("  1MIN : %f\n  5MIN : %f\n 15MIN : %f\n\n", loadavg[0], loadavg[1], loadavg[2]);

	return 0;
}

ヘッダはLinuxはstdlibに入っているらしい。

LOADAVG_NSTATSというのは無かったので適当に1024にしてみた。


コンパイルと実行

$ gcc -o loadavg loadavg.c
$ ./loadavg
  1MIN : 0.010000
  5MIN : 0.010000
 15MIN : 0.000000
longicorn
longicorn

元組込み→ソーシャゲ→Web系。 C、Ruby、Python、Scheme辺りをやっています。 https://twitter.com/prioninae