メモっす

interface IEntry{
  getMessage(): string;
}
class A implements IEntry{                                    
  getMessage() {
    return 'hello a.';
  }
}
class B implements IEntry{
  getMessage() {
    return 'hello b.';
  }
}
class C implements IEntry{
  getMessage() {
    return 'hello c.';
  }
}
class D {
  getMessage() {
    return 'hello d.';
  }
}

var arry: Array<IEntry> = [
  new A(),
  new B(),
  new C(),
  new D(),
];

for (var index in arry){
  var entry: IEntry = arry[index];
  console.log(entry.getMessage());
}

あれ、コレはコンパイル通るんだ。

[D言語],Go,C,PHPベンチマーク

#include <stdio.h>

int fib(int n) {
    if (n < 2) return n;
    return fib(n - 2) + fib(n - 1); 
}

int main(int argc, char *argv[]) {
    printf("%d\n", fib(45));
    return 0;
}

$ time ./a.out 
1134903170
real	0m16.715s
user	0m16.583s
sys	0m0.025s
#!/usr/bin/rdmd

import std.stdio;

int fib(int n) {
    if (n < 2) return n;
    return fib(n - 2) + fib(n - 1); 
}

void main() {
    printf(" %d\n", fib(45));
}

$ time ./fib
1134903170
real	0m13.871s
user	0m13.755s
sys	0m0.022s

$ time ./fib.d 
 1134903170
real	0m13.952s
user	0m13.808s
sys	0m0.026s
package main

import "fmt"


func fib(n int) int {
  if n < 2 { 
    return n
  }
  return fib(n - 2) + fib(n - 1)
}


func main() {
  var n int = 45
  fmt.Printf("fib(%d) = %d\n", n, fib(n))
}

$ time ./fib
fib(45) = 1134903170
real	0m11.332s
user	0m11.224s
sys	0m0.019s
<?php

function fib($n) {
  if ($n < 2) {return $n;}
  return fib($n - 2) + fib($n - 1); 
}

print(fib(45) . "\n");

$ time php fib.php 
1134903170
real	16m23.613s
user	16m7.627s
sys	0m2.503s

C:

久々[D言語]を揉む

import std.stdio;

void main() {
  Node n1 = new Node(1);
  Node n2 = new Node(2);
  Node n3 = new Node(3);
  Node n4 = new Node(4);
  Node n5 = new Node(5);
  Node n6 = new Node(6);

  n2.push(n1);
  n2.push(n6);
  n2.push(n4);
  n2.push(n5);
  n2.search(4);
}

class Node
{
  public:
    int key;
    Node left = null;
    Node right = null;
  public:
    this(int _key) {
      key = _key;
    }   
    void search(int _key) {
      if (key is _key) {
        printf("hit.\n");
      }   
      else if (key >= _key) {
        if (left is null) {
        } else {
          left.search(_key);
        }   
      }   
      else if (key < _key) {
        if (right is null) {
        } else {
          right.search(_key);
        }   
      }   
    }
    void push(Node node) {
      if (key >= node.key) {
        if (left is null) {
          left = node;
        } else {
          left.push(node);
        }   
      }   
      if (key < node.key) {
        if (right is null) {
          right = node;
        } else {
          right.push(node);
        }
      }
    }
}

test

redis_version:2.4.14
redis_git_sha1:00000000
redis_git_dirty:0
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.5
process_id:15010
uptime_in_seconds:73
uptime_in_days:0
lru_clock:1866474
used_cpu_sys:0.34
used_cpu_user:0.31
used_cpu_sys_children:0.00
used_cpu_user_children:0.00
connected_clients:1
connected_slaves:0
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
used_memory:5236304
used_memory_human:4.99M
used_memory_rss:6426624
used_memory_peak:5244800
used_memory_peak_human:5.00M
mem_fragmentation_ratio:1.23
mem_allocator:jemalloc-2.2.5
loading:0
aof_enabled:0
changes_since_last_save:0
bgsave_in_progress:0
last_save_time:1339870435
bgrewriteaof_in_progress:0
total_connections_received:6
total_commands_processed:6
expired_keys:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0
vm_enabled:0
role:master
db0:keys=28229,expires=0







$1601
# Server
redis_version:2.5.11
redis_git_sha1:00000000
redis_git_dirty:0
os:Linux 2.6.32-5-amd64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.5
process_id:15196
run_id:e2ef0af8b263fe68ad303d2de0755928ec82aea4
tcp_port:6379
uptime_in_seconds:16904
uptime_in_days:0
lru_clock:1868576

# Clients
connected_clients:2
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

# Memory
used_memory:2017736
used_memory_human:1.92M
used_memory_rss:3538944
used_memory_peak:2053912
used_memory_peak_human:1.96M
used_memory_lua:30720
mem_fragmentation_ratio:1.75
mem_allocator:jemalloc-3.0.0

# Persistence
loading:0
rdb_changes_since_last_save:3441
rdb_bgsave_in_progress:0
rdb_last_save_time:1339874616
rdb_last_bgsave_status:ok
rdb_
last_bgsave_time_sec:-1
rdb_current_bgsave_time_sec:-1
aof_enabled:1
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_current_size:1329499
aof_base_size:1329499
aof_pending_rewrite:0
aof_buffer_length:0
aof_rewrite_buffer_length:0
aof_pending_bio_fsync:0
aof_delayed_fsync:0

# Stats
total_connections_received:23662
total_commands_processed:23660
instantaneous_ops_per_sec:0
rejected_connections:0
expired_keys:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0

# Replication
role:master
connected_slaves:0

# CPU
used_cpu_sys:180.58
used_cpu_user:129.54
used_cpu_sys_children:0.00
used_cpu_user_children:0.00

# Keyspace
db0:keys=3441,expires=0
    if 15 < time.time() - metric_handler.timestamp:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((metric_handler.host, metric_handler.port))
        s.settimeout(5) # set socket timeout as to not block gmond
        # if the password is set from parameters
        if metric_handler.password != None:
                s.send("AUTH {0}\r\n".format(metric_handler.password))
                s.recv(4096) # TODO check if auth is valid
        s.send("INFO\r\n")
        info = s.recv(4096)
        if "$" != info[0]:
            return 0
        len = int(info[1:info.find("\n")])
        if 4096 < len:
            info += s.recv(len - 4096)
        metric_handler.info = {}
        for line in info.splitlines()[1:]:
            #if "" == line:
            #    continue
            n, v = line.split(":")
            if n in metric_handler.descriptors:
                metric_handler.info[n] = int(v) # TODO Use value_type.
        s.close()
        metric_handler.timestamp = time.time()

    return metric_handler.info.get(name, 0)

国産やなぎ 楊枝 MJP-01

国産やなぎ 楊枝 MJP-01

国産やなぎ 楊枝 MJP-01

国産やなぎ 楊枝 MJP-01

Debian6でGanglia入れてみた

apt-get install rrdtool librrds-perl librrd2-dev
apt-get install php5-gd
apt-get install ganglia-monitor gmetad
telnet localhost 8649
apt-get install ganglia-webfrontend
cp -p /etc/ganglia-webfrontend/apache.conf /etc/apache2/conf.d/ganglia.conf
/etc/init.d/apache2 restart

Ganglia用マシンの作成と導入

http://www.is.doshisha.ac.jp/isreport/entry/1480

Gmond Python metric modules

http://sourceforge.net/apps/trac/ganglia/wiki/ganglia_gmond_python_modules

Redis2.6 リリースされたメモ

起動メッセージが変わりました

なんか絵があります
2.6といいつつ Redis 2.5.7と出ますw
persistenceで起動したい場合は「--appendonly yes」と指定すると「appendonly.aof」というファイルに追記式に保存される

mucc@mucc-VirtualBox:~/work/redis-2.6.0-rc1$ ./src/redis-server  --appendonly yes
[4332] 30 Apr 00:56:22.844 # Unable to set the max number of files limit to 10032 (Operation not permitted), setting the max clients configuration to 3984.
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 2.5.7 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in stand alone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 4332
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

[4332] 30 Apr 00:56:22.849 # Server started, Redis version 2.5.7
[4332] 30 Apr 00:56:22.850 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

検証

Luaで簡単なサンプルデータを投入
UserIDしか入れてないけど、スペック上げても今のところ1台辺り1千万レコードが限界かな

eval "for i = 1, 100000    do redis.call('hset','user',i,'member_'..i) end" 0     1sec
eval "for i = 1, 1000000   do redis.call('hset','user',i,'member_'..i) end" 0    10sec     111,276Kbyte(約100byte)
eval "for i = 1, 10000000  do redis.call('hset','user',i,'member_'..i) end" 0   100sec   1,104,840Kbyte(約100byte)
eval "for i = 1, 100000000 do redis.call('hset','user',i,'member_'..i) end" 0   ※未検証

eval "for i = 1, 100000    do redis.call('SADD', 'user:1:follows', i) end" 0    1.2sec
eval "for i = 1, 1000000   do redis.call('SADD', 'user:1:follows', i) end" 0     10sec      110,540Kbyte(約100byte)
eval "for i = 1, 10000000  do redis.call('SADD', 'user:1:follows', i) end" 0    130sec    1,100,556Kbyte(約100byte)

運用の懸念点

AOFファイルをメモリ展開するため再起動後結構時間がかかる(1-5分程度)
AOFファイルを展開するのに1台のサーバーフルでメモリを使うとレプリケーションと同期するためのメモリが確保できなくなってしまう