lxyfirst

C++博客 首页 新随笔 联系 聚合 管理
  33 Posts :: 3 Stories :: 27 Comments :: 0 Trackbacks

#

1.GFS采用典型的管理节点(master)+数据节点(chunkserver)模式。
2.文件系统的meta-data信息由master维护,存放在内存中,通过log文件持久保存。
3.每个数据chunk的位置由chunkserver在启动时上报给master,master不维护这部分数据,主要是维护master和chunkserver的一致性比较麻烦。
4.master通过checkpoint和operation log的持久化保证master数据的可靠性。
5.checkpoint使用可映射内存数据结构的方式,以加速载入。
6.chunk使用版本号保证各个replication的一致性。
7.不一致的chunk将被统一回收。
8.更新数据时通过lease机制进行数据复制,客户端将数据写入各节点,成功后通知主节点更新状态。

posted @ 2010-08-11 10:06 star 阅读(199) | 评论 (0)编辑 收藏

1.信号的概念,信号是进程收到某些事件发生的通知机制,也被称为软中断。
信号的产生:信号一般有kernel产生,也可以由进程通过一些系统调用产生,如kill,abort,alrm,raise等。
信号的投递(delivery): kernel会将产生的信号尽快投递给相应进程(进程运行时或下一次被调度时),是异步过程,在产生之后,投递到进程之前的这段时间处于未决状态(pending)。
信号的阻塞(block):进程可以阻塞一些信号的投递,以防中断代码的执行,每个进程/线程有各自的阻塞信号掩码。阻塞状态中产生的相应信号处于未决状态(pending),直到进程解除阻塞时才被投递,相关调用如sigprocmask,pthread_sigmask , sigpending 。
信号的忽略(ignore):信号投递到进程后,调用相应信号处理程序,分为三种处理情况:默认:系统默认处理,忽略:不处理,自定义:调用自定义handler 。相关调用如signal,sigaction 。

2.信号分为实时信号和非实时信号,老的unix信号都是非实时信号,不排队(同时触发多个相同信号只有1次通知)。 新的SIGRTMIN~SIGRTMAX的信号是实时信号,排队。
3.带参数的信号处理
    在使用sigaction注册信号时,如果指定了SA_SIGINFO,则系统回调void (*sa_sigaction)(int, siginfo_t *, void *)进行信号处理,siginfo_t会被传送给处理函数,可以在其中的si_value中指定传递的数据。
    在发送信号时使用sigqueue,可以指定sigval,其中包含了需要传递的数据。
4.信号处理函数是不可重入的,所以一般只会在函数中设置一些flag,有用户程序异步处理,比如退出信号TERM的处理。
posted @ 2010-04-29 17:59 star 阅读(169) | 评论 (0)编辑 收藏

1.置socket为nonblock 。
2.连接,返回-1,errno为EINPROGRESS 。
3.使用select监控读写事件。
4.如果触发读写事件,重新connect,应返回-1,errno为EISCONN,表明连接成功。

Q :为何要重新connect ?
A :连接失败也可能触发读写事件,重新connect用于确定socket状态是否已连接。 


int sockfd = socket(AF_INET,SOCK_STREAM,0) ;
fcntl(sockfd,F_SETFL,O_NONBLOCK
|fcntl(sockfd,F_GETFL,0) ) ;
sockaddr_in addr 
= {0} ;
addr.sin_family 
= AF_INET ;
addr.sin_addr 
= inet_addr("192.168.0.1") ;
addr.sin_port 
= htons(80);
if ( connect(sockfd,addr,sizeof(addr)) < 0 && errno !=EINPROGRESS)
{
    
//connect failed
    close(sockfd) ;
    
return -1 ;
}
struct timeval timeout= {5,0} ;
fd_set rs,ws ;
FD_ZERO(
&rs) ;
FD_ZERO(
&ws) ;
FD_SET(sockfd,
&rs) ;
FD_SET(sockfd,
&ws) ;

if ( select(sockfd+1,&rs,&ws,NULL,&timeout)  < 1 )
{
        
//timeout
}
else
{
    
if ( connect(sockfd,addr,sizeof(addr)) < 0 && errno !=EISCONN)
    {
         
//connect failed
    }

    
//success

}





posted @ 2009-11-08 11:30 star 阅读(1393) | 评论 (1)编辑 收藏

sshd收到客户端连接请求时默认会做域名反查,反查过程如果慢,用户就会感觉连接慢。
1.最直接的办法是修改sshd的配置,UseDNS项改为0,重启sshd 。
2.修改hosts或resolv.conf , 使得sshd能够快速进行域名反查。

posted @ 2009-07-16 14:15 star 阅读(222) | 评论 (0)编辑 收藏

1.c++继承体系中内存布局的padding是保留的,这是为了防止父类和子类互相赋值时出现语义错误。
2.同样由于内部实现的差别,如padding或vptr的存在,慎用memset等内存直接操作方式,c++标准没有规定内存的布局细节。
3.指向对象成员的指针类型,其值是偏移值,这就产生一个问题,指向第一个成员的偏移值为0,空指针值也为0,必须对这种情况加以区分,实现策略是将指向成员的指针值(偏移)被加1,用以和空指针区分开来,因此使用指向成员的指针值应减1以得到真实的偏移。
X::*p=0 ;
X::*p=&X::first ;

posted @ 2009-05-22 12:37 star 阅读(153) | 评论 (0)编辑 收藏

函数式编程中一切皆是函数,函数的同一个输入产生的结果是确定的,不依赖于外部状态 。
所有的变量可以看作不可改变的,因此无法保存状态。
函数式编程的重点是定义而不是状态机的实现,而普通的过程式编程正好相反。
函数式程序中各语句不一定严格按顺序执行,但不影响结果,这种无序化正是并行运算的基础,是天然逻辑分离的。

closure :函数式强调无状态,但closure用于实现状态 。
continuation :将结果作为参数传给下一个函数 , 类似于返回地址的跳转,在函数返回时将结果作为参数调用下一个函数,用于实现有序化。
currying : 快速简易的创建数据封装,类似adapter模式,用于实现接口转换 。



posted @ 2009-04-20 15:58 star 阅读(227) | 评论 (0)编辑 收藏

1. epoll_create的参数size已经无效了,最初这个size用来定义hash的size,后来使用rbtree替换了hash,因此该参数失去作用。
2. epoll_wait传入的events和maxevents应相匹配,表示一次处理的event数量。传入大于1个的event结构的意义在于一次性处理多个事件能够提高效率,若maxevents小于此次触发事件的总数量,下次epoll_wait会继续触发上次遗留未处理的事件。
3. 用户在epoll_ctl添加监控事件时可以填写event.data.ptr以便在epoll_wait触发事件时获取原来填写的值,主要用于在回调函数。

posted @ 2009-04-14 18:10 star 阅读(205) | 评论 (0)编辑 收藏

1.解决eclipse在linux上浏览器加载失败问题 。
eclipse.ini中加入下面配置,使用xulrunner 。
-Dorg.eclipse.swt.browser.XULRunnerPath=/usr/lib64/xulrunner-1.9pre/xulrunner

-showsplash
org.eclipse.platform
-framework
plugins/org.eclipse.osgi_3
.4.3.R34x_v20081215-1030.jar
-vmargs
-Dorg.eclipse.swt.browser.XULRunnerPath
=/usr/lib64/xulrunner-1.9pre/xulrunner
-Dosgi.requiredJavaVersion
=1.5
-Xms40m
-Xmx256m
-XX:MaxPermSize
=256m

2.字体问题,修改/etc/fonts/fonts.conf 。

3.windows上安装X Server , Xming-6-9  ,并设置linux的环境变量export DISPLAY=XXXX:0 。

posted @ 2009-03-23 17:22 star 阅读(475) | 评论 (1)编辑 收藏

rrdtools其实是一个基于文件的数据库,用于数据积累,统计,生成图片。
1.创建数据库
rrdtool create usage.rrd DS:cpu:GAUGE:300:0:100 RRA:LAST
DS指定数据源,后面以':'为分隔符接着定义DS的属性,格式为DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max
ds-name:数据源的名字,a-zA-Z0-9 。
统计方式:
GAUGE:一般用于普通的统计,如不同时间点的人数。
COUNTER:一般用于持续增加的计数器,计算增加速度。
COMPUTE:一般用于需要对数据做特殊运算处理。
RRA指定数据统计方式,主要有MIN(最小值) , MAX(最大值) , AVERAGE(平均值) , LAST(单点值)。

2.添加数据
rrdtool update usage.rrd [time:value]

3.查看数据
rrdtool fetch
rrdtool dump

4.生成图片
rrdtool graph


监控cpu和网卡的脚本实例
rrd_init.sh
#!/bin/bash
cd $(dirname $0)

#network
awk -F':' '{if($1~/eth[0123456]$/ && $2 > 0 ) print $1;}' /proc/net/dev | while read if_name
do
    if_name=${if_name// }
    echo "creating ${if_name}.rrd  ..."
    /usr/local/rrdtool/bin/rrdtool create ${if_name}.rrd -s 60 DS:rx:COUNTER:120:U:U DS:tx:COUNTER:120:U:U RRA:AVERAGE:0.5:1:1440
done

#disk io
awk '{if($3~/[sh]d[abcdefgh]$/ && $4 > 0 ) print $3;}' /proc/diskstats | while read disk_name
do
    disk_name=${disk_name// }
    echo "creating ${disk_name}.rrd  ..."
    /usr/local/rrdtool/bin/rrdtool create ${disk_name}.rrd -s 60 DS:rio:COUNTER:120:U:U DS:wio:COUNTER:120:U:U RRA:AVERAGE:0.5:1:1440
done


#cpu
awk '{if($1~/^cpu/) print $1;}' /proc/stat | while  read cpu_name
do
    cpu_name=${cpu_name// }
    echo "creating ${cpu_name}.rrd  ..."
    /usr/local/rrdtool/bin/rrdtool create ${cpu_name}.rrd -s 60 DS:idle:COUNTER:120:U:U DS:user:COUNTER:120:U:U DS:iowait:COUNTER:120:U:U DS:i
ntr:COUNTER:120:U:U DS:total:COUNTER:120:U:U RRA:AVERAGE:0.5:1:1440

done

#memory

/usr/local/rrdtool/bin/rrdtool create memory.rrd -s 60 DS:TotalMemory:GAUGE:120:U:U DS:FreeMemory:GAUGE:120:U:U DS:TotalSwap:GAUGE:120:U:U D
S:FreeSwap:GAUGE:120:U:U RRA:AVERAGE:0.5:1:1440


rrd_stat.sh
* * * * * /usr/local/rrdtool/scripts/cpu_rrd_stat.sh > /dev/null 2>&1
#!/bin/bash
cd $(dirname $0)


#network
awk -F':' '{if($1~/eth[0123456]$/ && $2 > 0  ) printf("%s %s\n",$1,$2);}' /proc/net/dev | awk '{printf("%s %d %d\n",$1,$2,$10);}' | while read
 if_name if_rx if_tx
do
        if_name=${if_name// }
        /usr/local/rrdtool/bin/rrdtool update ${if_name}.rrd N:$if_rx:$if_tx
done

#disk io
awk '{if($3~/[sh]d[abcdefgh]$/ && $4 > 0 ) printf("%s %d %d\n",$3,$6,$10); }' /proc/diskstats | while  read disk_name disk_rio disk_wio
do
        disk_name=${disk_name// }
        /usr/local/rrdtool/bin/rrdtool update ${disk_name}.rrd N:$disk_rio:$disk_wio

done

#cpu
awk '{if($1~/^cpu/) {user=$2+$3 ;intr=$7+$8; printf("%s %d %d %d %d %d\n",$1,$5,user,$6,intr,user+$4+$5+$6+intr);} }' /proc/stat | while  read
 cpu_name cpu_idle cpu_user cpu_iowait cpu_intr cpu_total
do
        cpu_name=${cpu_name// }
        /usr/local/rrdtool/bin/rrdtool update ${cpu_name}.rrd N:$cpu_idle:$cpu_user:$cpu_iowait:$cpu_intr:$cpu_total

done


awk '{if($1~/^MemTotal/) mem_total=$2;else if($1~/^MemFree/) mem_free=$2;else if($1~/^SwapTotal/) swap_total=$2;else if($1~/^SwapFree/) swap_f
ree=$2;} END{printf("%d %d %d %d\n",mem_total,mem_free,swap_total,swap_free);}' /proc/meminfo | while  read mem_total mem_free swap_total swap
_free
do
    /usr/local/rrdtool/bin/rrdtool update memory.rrd N:$mem_total:$mem_free:$swap_total:$swap_free
done


rrd_img.sh
*/5 * * * * /usr/local/rrdtool/scripts/cpu_rrd_img.sh > /dev/null 2>&1
#!/bin/bash
cd $(dirname $0)
awk -F':' '{if($1~/eth[0123456]$/ && $2 > 0 ) print $1;}' /proc/net/dev | while read if_name
do
#        -y 10:10 -u 100 -l 0                                             \
    if_name=${if_name// }
    echo "creating [${if_name}.png]  ..."
    /usr/local/rrdtool/bin/rrdtool graph "${if_name}.png"    \
        -s -86400                                              \
        -w 500 -h 100                                          \
        -x MINUTE:30:HOUR:2:HOUR:2:0:%H:%M                \
        -Y  -t "${if_name} traffic"                      \
        DEF:rx=${if_name}.rrd:rx:AVERAGE                       \
        DEF:tx=${if_name}.rrd:tx:AVERAGE                       \
        CDEF:rx_mbps=rx,1,\/                              \
        CDEF:tx_mbps=tx,1,\/                              \
        LINE1:rx_mbps#FF0000:"rx(mbps)"                        \
        LINE1:tx_mbps#00FF00:"tx(mbps)"


done

awk '{if($3~/[sh]d[abcdefgh]$/ && $4 > 0 ) print $3;}' /proc/diskstats | while read disk_name
do
    disk_name=${disk_name// }
    echo "creating [${disk_name}.png]  ..."
    /usr/local/rrdtool/bin/rrdtool graph "${disk_name}.png"    \
        -s -86400                                              \
        -w 500 -h 100                                          \
        -x MINUTE:30:HOUR:2:HOUR:2:0:%H:%M                \
        -Y -t "${disk_name} io"                         \
        DEF:rio=${disk_name}.rrd:rio:AVERAGE                       \
        DEF:wio=${disk_name}.rrd:wio:AVERAGE                       \
        CDEF:rio_sector=rio,1,\/                              \
        CDEF:wio_sector=wio,1,\/                              \
        LINE1:rio_sector#00FF00:"rio(sector)"                        \
        LINE1:wio_sector#FF0000:"wio(sector)"


done

awk '{if($1~/^cpu/) print $1;}' /proc/stat | while  read cpu_name
do
    cpu_name=${cpu_name// }
    echo "creating [${cpu_name}.png]  ..."
    /usr/local/rrdtool/bin/rrdtool graph "${cpu_name}.png"      \
        -s -86400                                               \
        -w 500 -h 100                                           \
        -x MINUTE:30:HOUR:2:HOUR:2:0:%H:%M                \
        -Y  -t "${cpu_name} usage"                          \
        DEF:idle=${cpu_name}.rrd:idle:AVERAGE                   \
        DEF:user=${cpu_name}.rrd:user:AVERAGE                   \
        DEF:iowait=${cpu_name}.rrd:iowait:AVERAGE                   \
        DEF:intr=${cpu_name}.rrd:intr:AVERAGE                   \
        DEF:total=${cpu_name}.rrd:total:AVERAGE                 \
        CDEF:idle_persent=idle,total,\/,100,\*                         \
        CDEF:user_persent=user,total,\/,100,\*                         \
        CDEF:iowait_persent=iowait,total,\/,100,\*                         \
        CDEF:intr_persent=intr,total,\/,100,\*                         \
        LINE1:idle_persent#00FF00:"idle(%)"                        \
        LINE1:user_persent#0000FF:"user(%)"                        \
        LINE1:iowait_persent#FF0000:"iowait(%)"                    \
        LINE1:intr_persent#FF00FF:"intr(%)"

done

   rrd_name="memory"
    echo "creating [${rrd_name}.png]  ..."
    /usr/local/rrdtool/bin/rrdtool graph "${rrd_name}.png"      \
        -s -86400                                               \
        -w 500 -h 100                                           \
        -x MINUTE:30:HOUR:2:HOUR:2:0:%H:%M                \
        -Y  -t "${rrd_name} usage"                          \
        DEF:TotalMemory=${rrd_name}.rrd:TotalMemory:AVERAGE                   \
        DEF:FreeMemory=${rrd_name}.rrd:FreeMemory:AVERAGE                   \
        DEF:TotalSwap=${rrd_name}.rrd:TotalSwap:AVERAGE                   \
        DEF:FreeSwap=${rrd_name}.rrd:FreeSwap:AVERAGE                   \
        CDEF:TotalMemoryM=TotalMemory,1024,\/                         \
        CDEF:FreeMemoryM=FreeMemory,1024,\/                         \
        CDEF:TotalSwapM=TotalSwap,1024,\/                         \
        CDEF:FreeSwapM=FreeSwap,1024,\/                         \
        LINE1:TotalMemoryM#00FF00:"TotalMemory(M)"                        \
        LINE1:FreeMemoryM#0000FF:"FreeMemory(M)"                        \
        LINE1:TotalSwapM#FF0000:"TotalSwap(M)"                    \
        LINE1:FreeSwapM#FF00FF:"FreeSwap(M)"


cp 
*.png ${imgpath}/

posted @ 2009-01-15 12:22 star 阅读(3316) | 评论 (0)编辑 收藏

实现高性能服务器免不了进行代码级性能分析和系统级压力测试,简单整理一下代码级的性能分析工具
1.gprof : 非常易于使用 , 编译程序时使用-pg选项,然后执行程序,只要程序正常退出(从main()返回或exit退出) , 会生成gmon.out文件,这个文件包含了程序运行时收集的各种统计数据,使用gprof分析这个结果文件可以显示flat profile , call graph , annotated source 。值得注意的是无法跟踪内核态的执行情况和进程切换带来的影响。
2.valgrind :强大和全面的工具,主要包括memcheck,call graph , cache check , thread detector , heap profiler,测试server程序时需要注意信号处理,使程序正常退出。
3.oprofile : 不但可以分析单个程序性能,还能够分析系统性能 ,作为独立模块运行,使用cpu的计数寄存器进行数据分析。
             opcontrol --no-vmlinux --start    启动profile,此时系统会把收集的数据写入文件,系统的iowait非常高。
             opcontrol --stop                  关闭profile。
             opreport -l server_program        查看结果。

4.tcmalloc : google的内存分配器和profile工具,包括内存检查和cpu检查 ,可以编译进代码,也可以通过LIB_PRELOAD加载,配合环境变量实现profile功能。
            内存分配器:使用了线程cache ,在多线程的环境中比ptmalloc效率高2倍左右。

5.vtune    :intel开发的付费工具。


posted @ 2009-01-15 12:07 star 阅读(4075) | 评论 (1)编辑 收藏

仅列出标题
共4页: 1 2 3 4