• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            lxyfirst

            C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
              33 Posts :: 3 Stories :: 27 Comments :: 0 Trackbacks

            #

            1.GFS采用典型的管理節(jié)點(master)+數(shù)據(jù)節(jié)點(chunkserver)模式。
            2.文件系統(tǒng)的meta-data信息由master維護,存放在內(nèi)存中,通過log文件持久保存。
            3.每個數(shù)據(jù)chunk的位置由chunkserver在啟動時上報給master,master不維護這部分數(shù)據(jù),主要是維護master和chunkserver的一致性比較麻煩。
            4.master通過checkpoint和operation log的持久化保證master數(shù)據(jù)的可靠性。
            5.checkpoint使用可映射內(nèi)存數(shù)據(jù)結(jié)構(gòu)的方式,以加速載入。
            6.chunk使用版本號保證各個replication的一致性。
            7.不一致的chunk將被統(tǒng)一回收。
            8.更新數(shù)據(jù)時通過lease機制進行數(shù)據(jù)復(fù)制,客戶端將數(shù)據(jù)寫入各節(jié)點,成功后通知主節(jié)點更新狀態(tài)。

            posted @ 2010-08-11 10:06 star 閱讀(218) | 評論 (0)編輯 收藏

            1.信號的概念,信號是進程收到某些事件發(fā)生的通知機制,也被稱為軟中斷。
            信號的產(chǎn)生:信號一般有kernel產(chǎn)生,也可以由進程通過一些系統(tǒng)調(diào)用產(chǎn)生,如kill,abort,alrm,raise等。
            信號的投遞(delivery): kernel會將產(chǎn)生的信號盡快投遞給相應(yīng)進程(進程運行時或下一次被調(diào)度時),是異步過程,在產(chǎn)生之后,投遞到進程之前的這段時間處于未決狀態(tài)(pending)。
            信號的阻塞(block):進程可以阻塞一些信號的投遞,以防中斷代碼的執(zhí)行,每個進程/線程有各自的阻塞信號掩碼。阻塞狀態(tài)中產(chǎn)生的相應(yīng)信號處于未決狀態(tài)(pending),直到進程解除阻塞時才被投遞,相關(guān)調(diào)用如sigprocmask,pthread_sigmask , sigpending 。
            信號的忽略(ignore):信號投遞到進程后,調(diào)用相應(yīng)信號處理程序,分為三種處理情況:默認:系統(tǒng)默認處理,忽略:不處理,自定義:調(diào)用自定義handler 。相關(guān)調(diào)用如signal,sigaction 。

            2.信號分為實時信號和非實時信號,老的unix信號都是非實時信號,不排隊(同時觸發(fā)多個相同信號只有1次通知)。 新的SIGRTMIN~SIGRTMAX的信號是實時信號,排隊。
            3.帶參數(shù)的信號處理
                在使用sigaction注冊信號時,如果指定了SA_SIGINFO,則系統(tǒng)回調(diào)void (*sa_sigaction)(int, siginfo_t *, void *)進行信號處理,siginfo_t會被傳送給處理函數(shù),可以在其中的si_value中指定傳遞的數(shù)據(jù)。
                在發(fā)送信號時使用sigqueue,可以指定sigval,其中包含了需要傳遞的數(shù)據(jù)。
            4.信號處理函數(shù)是不可重入的,所以一般只會在函數(shù)中設(shè)置一些flag,有用戶程序異步處理,比如退出信號TERM的處理。
            posted @ 2010-04-29 17:59 star 閱讀(184) | 評論 (0)編輯 收藏

            1.置socket為nonblock 。
            2.連接,返回-1,errno為EINPROGRESS 。
            3.使用select監(jiān)控讀寫事件。
            4.如果觸發(fā)讀寫事件,重新connect,應(yīng)返回-1,errno為EISCONN,表明連接成功。

            Q :為何要重新connect ?
            A :連接失敗也可能觸發(fā)讀寫事件,重新connect用于確定socket狀態(tài)是否已連接。 


            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 閱讀(1431) | 評論 (1)編輯 收藏

            sshd收到客戶端連接請求時默認會做域名反查,反查過程如果慢,用戶就會感覺連接慢。
            1.最直接的辦法是修改sshd的配置,UseDNS項改為0,重啟sshd 。
            2.修改hosts或resolv.conf , 使得sshd能夠快速進行域名反查。

            posted @ 2009-07-16 14:15 star 閱讀(232) | 評論 (0)編輯 收藏

            1.c++繼承體系中內(nèi)存布局的padding是保留的,這是為了防止父類和子類互相賦值時出現(xiàn)語義錯誤。
            2.同樣由于內(nèi)部實現(xiàn)的差別,如padding或vptr的存在,慎用memset等內(nèi)存直接操作方式,c++標準沒有規(guī)定內(nèi)存的布局細節(jié)。
            3.指向?qū)ο蟪蓡T的指針類型,其值是偏移值,這就產(chǎn)生一個問題,指向第一個成員的偏移值為0,空指針值也為0,必須對這種情況加以區(qū)分,實現(xiàn)策略是將指向成員的指針值(偏移)被加1,用以和空指針區(qū)分開來,因此使用指向成員的指針值應(yīng)減1以得到真實的偏移。
            X::*p=0 ;
            X::*p=&X::first ;

            posted @ 2009-05-22 12:37 star 閱讀(174) | 評論 (0)編輯 收藏

            函數(shù)式編程中一切皆是函數(shù),函數(shù)的同一個輸入產(chǎn)生的結(jié)果是確定的,不依賴于外部狀態(tài) 。
            所有的變量可以看作不可改變的,因此無法保存狀態(tài)。
            函數(shù)式編程的重點是定義而不是狀態(tài)機的實現(xiàn),而普通的過程式編程正好相反。
            函數(shù)式程序中各語句不一定嚴格按順序執(zhí)行,但不影響結(jié)果,這種無序化正是并行運算的基礎(chǔ),是天然邏輯分離的。

            closure :函數(shù)式強調(diào)無狀態(tài),但closure用于實現(xiàn)狀態(tài) 。
            continuation :將結(jié)果作為參數(shù)傳給下一個函數(shù) , 類似于返回地址的跳轉(zhuǎn),在函數(shù)返回時將結(jié)果作為參數(shù)調(diào)用下一個函數(shù),用于實現(xiàn)有序化。
            currying : 快速簡易的創(chuàng)建數(shù)據(jù)封裝,類似adapter模式,用于實現(xiàn)接口轉(zhuǎn)換 。



            posted @ 2009-04-20 15:58 star 閱讀(241) | 評論 (0)編輯 收藏

            1. epoll_create的參數(shù)size已經(jīng)無效了,最初這個size用來定義hash的size,后來使用rbtree替換了hash,因此該參數(shù)失去作用。
            2. epoll_wait傳入的events和maxevents應(yīng)相匹配,表示一次處理的event數(shù)量。傳入大于1個的event結(jié)構(gòu)的意義在于一次性處理多個事件能夠提高效率,若maxevents小于此次觸發(fā)事件的總數(shù)量,下次epoll_wait會繼續(xù)觸發(fā)上次遺留未處理的事件。
            3. 用戶在epoll_ctl添加監(jiān)控事件時可以填寫event.data.ptr以便在epoll_wait觸發(fā)事件時獲取原來填寫的值,主要用于在回調(diào)函數(shù)。

            posted @ 2009-04-14 18:10 star 閱讀(226) | 評論 (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  ,并設(shè)置linux的環(huán)境變量export DISPLAY=XXXX:0 。

            posted @ 2009-03-23 17:22 star 閱讀(494) | 評論 (1)編輯 收藏

            rrdtools其實是一個基于文件的數(shù)據(jù)庫,用于數(shù)據(jù)積累,統(tǒng)計,生成圖片。
            1.創(chuàng)建數(shù)據(jù)庫
            rrdtool create usage.rrd DS:cpu:GAUGE:300:0:100 RRA:LAST
            DS指定數(shù)據(jù)源,后面以':'為分隔符接著定義DS的屬性,格式為DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max
            ds-name:數(shù)據(jù)源的名字,a-zA-Z0-9 。
            統(tǒng)計方式:
            GAUGE:一般用于普通的統(tǒng)計,如不同時間點的人數(shù)。
            COUNTER:一般用于持續(xù)增加的計數(shù)器,計算增加速度。
            COMPUTE:一般用于需要對數(shù)據(jù)做特殊運算處理。
            RRA指定數(shù)據(jù)統(tǒng)計方式,主要有MIN(最小值) , MAX(最大值) , AVERAGE(平均值) , LAST(單點值)。

            2.添加數(shù)據(jù)
            rrdtool update usage.rrd [time:value]

            3.查看數(shù)據(jù)
            rrdtool fetch
            rrdtool dump

            4.生成圖片
            rrdtool graph


            監(jiān)控cpu和網(wǎng)卡的腳本實例
            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 閱讀(3377) | 評論 (0)編輯 收藏

            實現(xiàn)高性能服務(wù)器免不了進行代碼級性能分析和系統(tǒng)級壓力測試,簡單整理一下代碼級的性能分析工具
            1.gprof : 非常易于使用 , 編譯程序時使用-pg選項,然后執(zhí)行程序,只要程序正常退出(從main()返回或exit退出) , 會生成gmon.out文件,這個文件包含了程序運行時收集的各種統(tǒng)計數(shù)據(jù),使用gprof分析這個結(jié)果文件可以顯示flat profile , call graph , annotated source 。值得注意的是無法跟蹤內(nèi)核態(tài)的執(zhí)行情況和進程切換帶來的影響。
            2.valgrind :強大和全面的工具,主要包括memcheck,call graph , cache check , thread detector , heap profiler,測試server程序時需要注意信號處理,使程序正常退出。
            3.oprofile : 不但可以分析單個程序性能,還能夠分析系統(tǒng)性能 ,作為獨立模塊運行,使用cpu的計數(shù)寄存器進行數(shù)據(jù)分析。
                         opcontrol --no-vmlinux --start    啟動profile,此時系統(tǒng)會把收集的數(shù)據(jù)寫入文件,系統(tǒng)的iowait非常高。
                         opcontrol --stop                  關(guān)閉profile。
                         opreport -l server_program        查看結(jié)果。

            4.tcmalloc : google的內(nèi)存分配器和profile工具,包括內(nèi)存檢查和cpu檢查 ,可以編譯進代碼,也可以通過LIB_PRELOAD加載,配合環(huán)境變量實現(xiàn)profile功能。
                        內(nèi)存分配器:使用了線程cache ,在多線程的環(huán)境中比ptmalloc效率高2倍左右。

            5.vtune    :intel開發(fā)的付費工具。


            posted @ 2009-01-15 12:07 star 閱讀(4110) | 評論 (1)編輯 收藏

            僅列出標題
            共4頁: 1 2 3 4 
            久久精品国产一区二区电影| 久久国内免费视频| 国产成人综合久久综合| 久久er热视频在这里精品| 久久av高潮av无码av喷吹| 99精品国产免费久久久久久下载| 久久综合偷偷噜噜噜色| 欧美丰满熟妇BBB久久久| 欧美亚洲国产精品久久蜜芽| 久久久久久久精品妇女99| 久久精品毛片免费观看| 亚洲人成电影网站久久| 岛国搬运www久久| 久久精品国产亚洲av水果派| 色婷婷综合久久久久中文字幕| 久久w5ww成w人免费| 免费无码国产欧美久久18| 91久久香蕉国产熟女线看| 男女久久久国产一区二区三区| 久久精品国产一区二区 | 久久精品国产91久久麻豆自制| 欧美激情精品久久久久久久| 久久久久国产一级毛片高清版| 中文字幕人妻色偷偷久久| 亚洲婷婷国产精品电影人久久| 欧美精品一本久久男人的天堂| 久久国产免费观看精品3| 人妻无码久久一区二区三区免费 | 久久久久国产成人精品亚洲午夜| 久久精品无码一区二区WWW| 久久精品国产一区二区电影| 精品国产91久久久久久久a| 久久精品草草草| 国产精久久一区二区三区| 久久精品草草草| 精品国产综合区久久久久久 | 99久久精品这里只有精品| 久久久青草久久久青草| 99999久久久久久亚洲| 国产午夜精品理论片久久影视| 91久久精品91久久性色|