火曜日, 11月 28, 2006

使いやすいOS (Distribution)

最近使ったOSで,大勢に使いやすいOSはこんな感じだと思う
1. MacOS X
2. Windows XP
3. Ubuntu
4. Fedora 6 or SuSE
6. Debian
7. FreeBSD
8. NetBSD
9. gentoo or OpenBSD
11. Solaris

個人的に使いやすいOSはこんな感じ
1. MacOS X
2. Debian
3. NetBSD
4. Ubuntu
5. Windows XP
6. SuSE
7. Fedora 6 or FreeBSD
9. OpenBSD or gentoo
11. Solaris

Appleはユーザのことを良くわかっていると感じる.
Microsoftも実は結構良くわかっているが,センスが無い.
Sunは全くわかっていない.最悪.
BSD系,Debian系は,自分たちの路線をしっかり持っている感じ.
Fedora 6, SuSEはどっちつかず.

月曜日, 11月 27, 2006

暗号化の速度

次は暗号化の速度を計算.
計測マシンは,CPU: PentiumIII 933MHz x 2, Memory: 1GB, OS: Debian etch / Linux 2.6
測定するのは,AES 128bit CBCモード,AES 256bit CBCモード,sha1
% openssl speed aes-128-cbc aes-256-cbc sha1
Doing sha1 for 3s on 16 size blocks: 1030353 sha1's in 3.00s
Doing sha1 for 3s on 64 size blocks: 824617 sha1's in 3.01s
Doing sha1 for 3s on 256 size blocks: 500991 sha1's in 3.00s
Doing sha1 for 3s on 1024 size blocks: 194812 sha1's in 3.00s
Doing sha1 for 3s on 8192 size blocks: 29062 sha1's in 3.00s
Doing aes-128 cbc for 3s on 16 size blocks: 3020029 aes-128 cbc's in 3.00s
Doing aes-128 cbc for 3s on 64 size blocks: 1348323 aes-128 cbc's in 3.00s
Doing aes-128 cbc for 3s on 256 size blocks: 419475 aes-128 cbc's in 3.01s
Doing aes-128 cbc for 3s on 1024 size blocks: 111829 aes-128 cbc's in 3.00s
Doing aes-128 cbc for 3s on 8192 size blocks: 14270 aes-128 cbc's in 3.00s
Doing aes-256 cbc for 3s on 16 size blocks: 2647977 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 64 size blocks: 1078655 aes-256 cbc's in 3.01s
Doing aes-256 cbc for 3s on 256 size blocks: 319714 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 1024 size blocks: 83899 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 8192 size blocks: 10642 aes-256 cbc's in 3.00s
OpenSSL 0.9.8c 05 Sep 2006
built on: Mon Oct 2 16:47:57 UTC 2006
options:bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long)
aes(partial) blowfish(idx)
compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT
-DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -DTERMIO -O3 -march=i686 -Wa,--noexecstack
-g -Wall -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_IA32_SSE2 -DSHA1_ASM -DMD5_ASM
-DRMD160_ASM -DAES_ASM
available timing options: TIMES TIMEB HZ=100 [sysconf value]
timing function used: times
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
sha1 5495.22k 17533.38k 42751.23k 66495.83k 79358.63k
aes-128 cbc 16106.82k 28764.22k 35676.28k 38170.97k 38966.61k
aes-256 cbc 14122.54k 22934.86k 27282.26k 28637.53k 29059.75k


という感じなんだけど,この値,k(キロ)じゃなくて,M(メガ)の間違いな気がする…
(8192bytes x 10642) / 3(s) x 1000(s) = 29056207333.33 = 29056.20M

というのはおいておいて,
AESの暗号化速度は,単純に相加平均して計算してみると,
AES 128: 252.3Mbps
AES 256: 192.3Mbps

という感じ,

sha1は,1024bytesのパケットを定常的に送信した場合
544.73Mbps

の速度が出る.
しかし,16bytesのパケットを定常的に送信したら,
44.0Mbps

しかでない.

PentiumIII 933MHzでAES 128使って暗号化している限り,限界値は250Mbpsあたり.
RC4使うと,この倍以上は出るっぽい.
しかし,1パケット毎に32バイト分だけ,AES 256で暗号化しているので,113Mbpsが限界っぽくて,netperfで測った速度はそれなりに良い結果なのがわかった.

つまり,どんなにプログラムを最適化しても,現状の2倍以上の性能は出せない.
通常の3倍には及ばないというわけです.
これならムーアの法則のほうが早いね.

netperf その2

環境は前と同じ.
netperf Server側:
OS: Debian etch Testing / Linux 2.6.16-2-686
CPU: PentiumIII 933MHz x 2
Memory: 1GB

netperf Client側:
OS: Debian etch Testing / Linux 2.6.16-2-686
CPU: PnetiumIII 900MHz x 4 on VMWare server
Memory: 256MB

実ネットワーク
% netperf -t TCP_STREAM -H solomon
TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET
to solomon port 0 AF_INET
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec

87380 16384 16384 10.01 41.74

% netperf -t UDP_STREAM -H solomon.jpcert.cc
UDP UNIDIRECTIONAL SEND TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET
to solomon port 0 AF_INET
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec

107520 65507 10.00 7937 0 415.91
105472 10.00 60 3.14


仮想ネットワーク
% netperf -t TCP_STREAM -H 172.24.194.52
TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET
to 172.24.194.52 (172.24.194.52) port 0 AF_INET
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec

87380 16384 16384 10.02 29.47

% netperf -t UDP_STREAM -H 172.24.194.52
UDP UNIDIRECTIONAL SEND TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET
to 172.24.194.52 (172.24.194.52) port 0 AF_INET
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec

107520 65507 10.00 999 0 52.34
105472 10.00 644 33.74

結果
    実ネットワーク P2P@i
TCP 41.7Mbps 29.4Mbps
UDP 415.9Mbps 52.3Mbps

最近のCore 2 Duoとかだったらもっと早そうだけど.
DVTSの30Mbpsをなんとか送信できる程度は出てるので,こんなもんかな.

ところで,クライアントにNetBSD 4.0 Betaを使うと,かなりスループットが上がる事が判明.

netperf Server側:
OS: Debian etch Testing / Linux 2.6.16-2-686
CPU: PentiumIII 933MHz x 2
Memory: 1GB

netperf Client側:
OS: NetBSD 4.0 Beta
CPU: PentiumIII 933MHz x 2
Memory: 1GB
/usr/pkg/netperf/netperf -t TCP_STREAM -H solomon
TCP STREAM TEST to solomon : histogram
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec

87380 32768 32768 10.01 695.22

netperf Client側:
OS: Ubuntu 6.10 / Linux 2.6.17-10-server
CPU: PentiumIII 933MHz x 2
Memory: 1GB
netperf -t TCP_STREAM -H solomon
TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET
to solomon port 0 AF_INET
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec

87380 16384 16384 10.02 54.34

結果
     Linux 2.6 NetBSD 4
TCP 54.3Mbps 695.2Mbps

うーん,こんなに違うものなのか???
今度,Windows XPとMacOS Xで試してみよう.

土曜日, 11月 25, 2006

メモリプール

UDPで送信した場合,mbufみたいにメモりプールしている数が足りなくなってるっぽい…
それで,UDPの場合は遅いのか.
プールの数も考えないとな.
1024 x 16パケット分のプールじゃ足りないのか.
2048 x 1024 x 16 = 32MB
しか使ってないから,もっと豪勢にとるかな…
悩むところだ.
きょうび,128MBぐらい使っても問題ない気もするが.

netperfを使った測定

netperf Server側:
OS: Debian etch Testing / Linux 2.6.16-2-686
CPU: PentiumIII 933MHz x 2
Memory: 1GB

netperf Client側:
OS: Debian etch Testing / Linux 2.6.16-2-686
CPU: PnetiumIII 900MHz x 4 on VMWare server
Memory: 256MB

まずは実ネットワークの測定結果
% netper -T  TCP_STREAM -H solomon
TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET
to solomon port 0 AF_INET
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec

87380 16384 16384 10.03 51.73

% netperf -t UDP_STREAM -H solomon
UDP UNIDIRECTIONAL SEND TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET
to solomon port 0 AF_INET
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec

107520 65507 10.00 7318 0 383.38
105472 10.00 74 3.88


続いて,P2P@i上
% netperf -t TCP_STREAM -H 172.24.251.203
TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET
to 172.24.251.203 (172.24.251.203) port 0 AF_INET
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec

87380 16384 16384 10.02 30.00

% netperf -t UDP_STREAM -H 172.24.251.203
UDP UNIDIRECTIONAL SEND TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET
to 172.24.251.203 (172.24.251.203) port 0 AF_INET
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec

107520 65507 10.00 873 0 45.74
105472 10.00 865 45.32

結果
    実ネットワーク P2P@i
TCP 51.7Mbps 30.0Mbps
UDP 383.4Mbps 45.8Mbps


VM使ってこれだけでれば,動画ぐらいはストリーム出来そうだな.

SIGPIPE

TCPのsocket書き込み時等に,既に相手側が閉じていたら,SIGPIPEが投げられる.
SIGPIPEが飛んでくるとアプリケーションが終了してしまうので,SIGPIPEを捕捉しなければいけないっぽい.
writeやsendtoに失敗した場合,errnoにはEPIPEがセットされる.
WRITE(2)                    BSD System Calls Manual                   WRITE(2)

NAME
write, writev, pwrite - write output

...

ERRORS
Write(), writev(), and pwrite() will fail and the file pointer will
remain unchanged if:
[EPIPE] An attempt is made to write to a pipe that is not open
for reading by any process.

[EPIPE] An attempt is made to write to a socket of type
SOCK_STREAM that is not connected to a peer socket.

火曜日, 11月 21, 2006

マルチキャスト

マルチキャストパケットがぐるぐるまわる~!!
最近転送したパケットの情報を保存するようにしないと…

月曜日, 11月 20, 2006

Macで動いた

1. 一つのプラットフォームでなんとか動く
2. 複数のプラットフォームでなんとか動く We are here!
3. 一部のプラットフォームで安定して動く
4. 複数のプラットフォームで安定して動く
5. 複数のプラットフォームで効率的に動く

C++ on MacOS X Panther

MacOS X Panther対応のg++は,Appleからはversion 3までしか出ていない
g++ version 3ではC++のtemplateとSTLを使うとうまく動かない場合があるので,Finkを入れて,g++のversion 4を使うようにしよう.

木曜日, 11月 16, 2006

iproute2 for Linux

eth0:
192.168.0.1

eth1:
10.0.0.1

destination next
192.168.0.0/24 192.168.0.88
10.0.0.0/8 10.0.0.88

# ip route add default via 192.50.109.88 table ispA
# ip route add default via 150.65.118.88 table ispB

# ip rule add from 192.168.0.0/24 lookup ispA
# ip rule add from 10.0.0.0/8 lookup ispB

# ip route add default via 192.168.0.88

水曜日, 11月 15, 2006

MacOS XにSTLportを入れる

1. STLportから,STLport 5.1.0 RC3をダウンロードしてくる.

2. STLport-5.1.0/stlport/stl/config/features.hに以下のパッチを当てる.
--- STLport-5.1.0/stlport/stl/config/features.h Sat Aug  5 18:11:19 2006
+++ STLport-5.1.0-apple/stlport/stl/config/features.h Wed Nov 15 01:07:56 2006
@@ -187,6 +187,12 @@
# else
# define _STLP_LITTLE_ENDIAN 1
# endif
+# elif defined (__APPLE__)
+# if defined (__BIG_ENDIAN__)
+# define _STLP_BIG_ENDIAN 1
+# else
+# define _STLP_LITTLE_ENDIAN 1
+# endif
# else
# error "can't determine endianess"
# endif

2.5 MacOS X Tigerの場合STLportのディレクトリに,C++のincludeディレクトリへのシンボリックリンクを作成する必要がある (2006/11/18 追加)
# ln -s /usr/include/c++/4.0.0 STLport-5.1.0/c++

3. makeする
% cd STLport-5.1.0/build/lib
% make -f gcc.mak clean all install

4. /usr/local以下にコピーする
% su
# tar cf - stlport | (cd /usr/local/include; tar xf -)
# chmod -R a+r /usr/local/include/stlport
# chown -R root:wheel /usr/local/include/stlport
# (cd lib; tar cf - --exclude=CVS --exclude=.cvsignore .) | (cd /usr/local/lib; tar xf -)
# chown -R root:wheel /usr/local/lib/libstlport*
# exit

gccで定義されているマクロを見る

% echo | gcc -v -E -dM -
#define __DBL_MIN_EXP__ (-1021)
#define __FLT_MIN__ 1.17549435e-38F
#define __CHAR_BIT__ 8
#define __WCHAR_MAX__ 2147483647
#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
...

MacOS Xの場合,
#define __APPLE__ 1

と定義されていて,エンディアンは,
#define __BIG_ENDIAN__ 1

となっているか,
#define __LITTLE_ENDIAN__ 1

となっている.

月曜日, 11月 13, 2006

tun/tap driver for Mac OS X

tun/tap driver for Mac OS X

Road Map

1. implement CUI
2. improve and modify the algorithm of DHT
3. implement Web UI
4. test on MacOS X Tiger, NetBSD 4, Debin testing, Fedora 6, Ubuntu 6.10
5. implement DNS
6. implement ICMP unreach
7. implement IP routing
8. implement a structure to collect data
9. test on some OSes
10. release and distribute!
11. implement IPv6
...

LinuxでBroadcast宛のpingに応答するようにする

# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

Fedora 6でselinuxを無効にする

起動時に無効にする.
# /usr/sbin/getenforce
Enforcing

# /usr/sbin/setenforce 1

# /usr/sbin/getenforce
Permissive

設定ファイルで無効にしておく.
# vi /etc/selinux/config
# SELINUX=enforcing
SELINUX=disabled

日曜日, 11月 12, 2006

Fedora 6でiptablesを無効にする

# /etc/rc.d/init.d/iptables stop

# /sbin/chkconfig iptables off

Fedora 6でIPv4のzeroconfを無効にする

# netstat -rn
Destination Gateway Genmask
169.254.0.0 0.0.0.0 255.255.0.0

# vi /etc/sysconfig/network
NOZEROCONF=yes

# /etc/rc.d/init.d/network restart

# netstat -rn