<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    少年阿賓

    那些青春的歲月

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

    #

    java處理高并發(fā)高負載類網(wǎng)站中數(shù)據(jù)庫的設計方法(java教程,java處理大量數(shù)據(jù),java高負載數(shù)據(jù))

    一:高并發(fā)高負載類網(wǎng)站關注點之數(shù)據(jù)庫

    沒錯,首先是數(shù)據(jù)庫,這是大多數(shù)應用所面臨的首個SPOF。尤其是Web2.0的應用,數(shù)據(jù)庫的響應是首先要解決的。
    一般來說MySQL是最常用的,可能最初是一個mysql主機,當數(shù)據(jù)增加到100萬以上,那么,MySQL的效能急劇下降。常用的優(yōu)化措施是M-S(主-從)方式進行同步復制,將查詢和操作和分別在不同的服務器上進行操作。我推薦的是M-M-Slaves方式,2個主Mysql,多個Slaves,需要注意的是,雖然有2個Master,但是同時只有1個是Active,我們可以在一定時候切換。之所以用2個M,是保證M不會又成為系統(tǒng)的SPOF。
    Slaves可以進一步負載均衡,可以結合LVS,從而將select操作適當?shù)钠胶獾讲煌膕laves上。
    以上架構可以抗衡到一定量的負載,但是隨著用戶進一步增加,你的用戶表數(shù)據(jù)超過1千萬,這時那個M變成了SPOF。你不能任意擴充Slaves,否則復制同步的開銷將直線上升,怎么辦?我的方法是表分區(qū),從業(yè)務層面上進行分區(qū)。最簡單的,以用戶數(shù)據(jù)為例。根據(jù)一定的切分方式,比如id,切分到不同的數(shù)據(jù)庫集群去。

    全局數(shù)據(jù)庫用于meta數(shù)據(jù)的查詢。缺點是每次查詢,會增加一次,比如你要查一個用戶nightsailer,你首先要到全局數(shù)據(jù)庫群找到nightsailer對應的cluster id,然后再到指定的cluster找到nightsailer的實際數(shù)據(jù)。
    每個cluster可以用m-m方式,或者m-m-slaves方式。這是一個可以擴展的結構,隨著負載的增加,你可以簡單的增加新的mysql cluster進去。

    需要注意的是:
    1、禁用全部auto_increment的字段
    2、id需要采用通用的算法集中分配
    3、要具有比較好的方法來監(jiān)控mysql主機的負載和服務的運行狀態(tài)。如果你有30臺以上的mysql數(shù)據(jù)庫在跑就明白我的意思了。
    4、不要使用持久性鏈接(不要用pconnect),相反,使用sqlrelay這種第三方的數(shù)據(jù)庫鏈接池,或者干脆自己做,因為php4中mysql的鏈接池經(jīng)常出問題。
     
    二:高并發(fā)高負載網(wǎng)站的系統(tǒng)架構之HTML靜態(tài)化

    其實大家都知道,效率最高、消耗最小的就是純靜態(tài)化 http://www.ablanxue.com/shtml/201207/776.shtml的html頁面,所以我們盡可能使我們的網(wǎng)站上的頁面采用靜態(tài)頁面來實現(xiàn),這個最簡單的方法其實也是 最有效的方法。但是對于大量內(nèi)容并且頻繁更新的網(wǎng)站,我們無法全部手動去挨個實現(xiàn),于是出現(xiàn)了我們常見的信息發(fā)布系統(tǒng)CMS,像我們常訪問的各個門戶站點 的新聞頻道,甚至他們的其他頻道,都是通過信息發(fā)布系統(tǒng)來管理和實現(xiàn)的,信息發(fā)布系統(tǒng)可以實現(xiàn)最簡單的信息錄入自動生成靜態(tài)頁面,還能具備頻道管理、權限 管理、自動抓取等功能,對于一個大型網(wǎng)站來說,擁有一套高效、可管理的CMS是必不可少的。
      
      除了門戶和信息發(fā)布類型的網(wǎng)站,對于交互性要求很高的社區(qū)類型網(wǎng)站來說,盡可能的靜態(tài)化也是提高性能的必要手段,將社區(qū)內(nèi)的帖子、文章進行實時的靜態(tài)化,有更新的時候再重新靜態(tài)化也是大量使用的策略,像Mop的大雜燴就是使用了這樣的策略,網(wǎng)易社區(qū)等也是如此。
      
       同時,html靜態(tài)化也是某些緩存策略使用的手段,對于系統(tǒng)中頻繁使用數(shù)據(jù)庫查詢但是內(nèi)容更新很小的應用,可以考慮使用html靜態(tài)化來實現(xiàn),比如論壇 中論壇的公用設置信息,這些信息目前的主流論壇都可以進行后臺管理并且存儲再數(shù)據(jù)庫中,這些信息其實大量被前臺程序調(diào)用,但是更新頻率很小,可以考慮將這 部分內(nèi)容進行后臺更新的時候進行靜態(tài)化,這樣避免了大量的數(shù)據(jù)庫訪問請求高并發(fā)。
      

    網(wǎng)站HTML靜態(tài)化解決方案
    當一個Servlet資源請求到達WEB服務器之后我們會填充指定的JSP頁面來響應請求:

    HTTP請求---Web服務器---Servlet--業(yè)務邏輯處理--訪問數(shù)據(jù)--填充JSP--響應請求

    HTML靜態(tài)化之后:

    HTTP請求---Web服務器---Servlet--HTML--響應請求

    靜態(tài)訪求如下

    Servlet:

    public void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
        if(request.getParameter("chapterId") != null){ 
            String chapterFileName = "bookChapterRead_"+request.getParameter("chapterId")+".html"; 
            String chapterFilePath = getServletContext().getRealPath("/") + chapterFileName; 
            File chapterFile = new File(chapterFilePath); 
            if(chapterFile.exists()){response.sendRedirect(chapterFileName);return;}//如果有這個文件就告訴瀏覽器轉(zhuǎn)向  
            INovelChapterBiz novelChapterBiz = new NovelChapterBizImpl(); 
            NovelChapter novelChapter = novelChapterBiz.searchNovelChapterById(Integer.parseInt(request.getParameter("chapterId")));//章節(jié)信息  
            int lastPageId = novelChapterBiz.searchLastCHapterId(novelChapter.getNovelId().getId(), novelChapter.getId()); 
            int nextPageId = novelChapterBiz.searchNextChapterId(novelChapter.getNovelId().getId(), novelChapter.getId()); 
            request.setAttribute("novelChapter", novelChapter); 
            request.setAttribute("lastPageId", lastPageId); 
            request.setAttribute("nextPageId", nextPageId); 
            new CreateStaticHTMLPage().createStaticHTMLPage(request, response, getServletContext(),  
                    chapterFileName, chapterFilePath, "/bookRead.jsp"); 
        } 

    生成HTML靜態(tài)頁面的類:

    package com.jb.y2t034.thefifth.web.servlet; 
    import java.io.ByteArrayOutputStream; 
    import java.io.FileOutputStream; 
    import java.io.IOException; 
    import java.io.OutputStreamWriter; 
    import java.io.PrintWriter; 
    import javax.servlet.RequestDispatcher; 
    import javax.servlet.ServletContext; 
    import javax.servlet.ServletException; 
    import javax.servlet.ServletOutputStream; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 
    import javax.servlet.http.HttpServletResponseWrapper; 
    /**
     * 創(chuàng)建HTML靜態(tài)頁面
     * 功能:創(chuàng)建HTML靜態(tài)頁面
     * 時間:2009年1011日
     * 地點:home
     * @author mavk
     *
     */ 
    public class CreateStaticHTMLPage { 
        /**
         * 生成靜態(tài)HTML頁面的方法
         * @param request 請求對象
         * @param response 響應對象
         * @param servletContext Servlet上下文
         * @param fileName 文件名稱
         * @param fileFullPath 文件完整路徑
         * @param jspPath 需要生成靜態(tài)文件的JSP路徑(相對即可)
         * @throws IOException
         * @throws ServletException
         */ 
        public void createStaticHTMLPage(HttpServletRequest request, HttpServletResponse response,ServletContext servletContext,String fileName,String fileFullPath,String jspPath) throws ServletException, IOException{ 
            response.setContentType("text/html;charset=gb2312");//設置HTML結果流編碼(即HTML文件編碼)  
            RequestDispatcher rd = servletContext.getRequestDispatcher(jspPath);//得到JSP資源  
            final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();//用于從ServletOutputStream中接收資源  
            final ServletOutputStream servletOuputStream = new ServletOutputStream(){//用于從HttpServletResponse中接收資源  
                public void write(byte[] b, int off,int len){ 
                    byteArrayOutputStream.write(b, off, len); 
                } 
                public void write(int b){ 
                    byteArrayOutputStream.write(b); 
                } 
            }; 
            final PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream));//把轉(zhuǎn)換字節(jié)流轉(zhuǎn)換成字符流  
            HttpServletResponse httpServletResponse = new HttpServletResponseWrapper(response){//用于從response獲取結果流資源(重寫了兩個方法)  
                public ServletOutputStream getOutputStream(){ 
                    return servletOuputStream; 
                } 
                public PrintWriter getWriter(){ 
                    return printWriter; 
                } 
            }; 
            rd.include(request, httpServletResponse);//發(fā)送結果流  
            printWriter.flush();//刷新緩沖區(qū),把緩沖區(qū)的數(shù)據(jù)輸出  
            FileOutputStream fileOutputStream = new FileOutputStream(fileFullPath); 
            byteArrayOutputStream.writeTo(fileOutputStream);//把byteArrayOuputStream中的資源全部寫入到fileOuputStream中  
            fileOutputStream.close();//關閉輸出流,并釋放相關資源  
            response.sendRedirect(fileName);//發(fā)送指定文件流到客戶端  
        } 
    }
     

    三:高并發(fā)高負載類網(wǎng)站關注點之緩存、負載均衡、存儲

    緩存是另一個大問題,我一般用memcached來做緩存集群,一般來說部署10臺左右就差不多(10g內(nèi)存池)。需要注意一點,千萬不能用使用
    swap,最好關閉linux的swap。


    負載均衡/加速
     
    可能上面說緩存的時候,有人第一想的是頁面靜態(tài)化,所謂的靜態(tài)html,我認為這是常識,不屬于要點了。頁面的靜態(tài)化隨之帶來的是靜態(tài)服務的
    負載均衡和加速。我認為Lighttped+Squid是最好的方式了。
    LVS <------->lighttped====>squid(s) ====lighttpd

    上面是我經(jīng)常用的。注意,我沒有用apache,除非特定的需求,否則我不部署apache,因為我一般用php-fastcgi配合lighttpd,
    性能比apache+mod_php要強很多。

    squid的使用可以解決文件的同步等等問題,但是需要注意,你要很好的監(jiān)控緩存的命中率,盡可能的提高的90%以上。
    squid和lighttped也有很多的話題要討論,這里不贅述。


    存儲
     存儲也是一個大問題,一種是小文件的存儲,比如圖片這類。另一種是大文件的存儲,比如搜索引擎的索引,一般單文件都超過2g以上。
    小文件的存儲最簡單的方法是結合lighttpd來進行分布。或者干脆使用Redhat的GFS,優(yōu)點是應用透明,缺點是費用較高。我是指
    你購買盤陣的問題。我的項目中,存儲量是2-10Tb,我采用了分布式存儲。這里要解決文件的復制和冗余。
    這樣每個文件有不同的冗余,這方面可以參考google的gfs的論文。
    大文件的存儲,可以參考nutch的方案,現(xiàn)在已經(jīng)獨立為hadoop子項目。(你可以google it)

    其他:
    此外,passport等也是考慮的,不過都屬于比較簡單的了。
    四:高并發(fā)高負載網(wǎng)站的系統(tǒng)架構之圖片服務器分離
    大家知道,對于Web 服務器來說,不管是Apache、IIS還是其他容器,圖片是最消耗資源的,于是我們有必要將圖片與頁面進行分離,這是基本上大型網(wǎng)站都會采用的策略,他 們都有獨立的圖片服務器,甚至很多臺圖片服務器。這樣的架構可以降低提供頁面訪問請求的服務器系統(tǒng)壓力,并且可以保證系統(tǒng)不會因為圖片問題而崩潰,在應用 服務器和圖片服務器上,可以進行不同的配置優(yōu)化,比如apache在配置ContentType的時候可以盡量少支持,盡可能少的LoadModule, 保證更高的系統(tǒng)消耗和執(zhí)行效率。


    利用Apache實現(xiàn)圖片服務器的分離
    緣由:
    起步階段的應用,都可能部署在一臺服務器上(費用上的原因)
    第一個優(yōu)先分離的,肯定是數(shù)據(jù)庫和應用服務器。
    第二個分離的,會是什么呢?各有各的考慮,我所在的項目組重點考慮的節(jié)約帶寬,服務器性能再好,帶寬再高,并發(fā)來了,也容易撐不住。因此,我這篇文章的重點在這里。這里重點是介紹實踐,不一定符合所有情況,供看者參考吧,
    環(huán)境介紹:
    WEB應用服務器:4CPU雙核2G, 內(nèi)存4G
      部署:Win2003/Apache Http Server 2.1/Tomcat6
    數(shù)據(jù)庫服務器:4CPU雙核2G, 內(nèi)存4G
      部署:Win2003/MSSQL2000
    步驟:
    步驟一:增加2臺配置為:2CPU雙核2G,內(nèi)存2G普通服務器,做資源服務器
      部署:Tomcat6,跑了一個圖片上傳的簡單應用,(記得指定web.xml的<distributable/>),并指定域名為res1.***.com,res2.***.com,采用ajp協(xié)議
    步驟二:修改Apache httpd.conf配置
      原來應用的文件上傳功能網(wǎng)址為:
       1、/fileupload.html
       2、/otherupload.html
      在httpd.conf中增加如下配置

    <VirtualHost *:80>  
      ServerAdmin webmaster@***.com  
      ProxyPass /fileupload.html balancer://rescluster/fileupload lbmethod=byrequests stickysession=JSESSIONID nofailover=Off timeout=5 maxattempts=3     
      ProxyPass /otherupload.html balancer://rescluster/otherupload.html lbmethod=byrequests stickysession=JSESSIONID nofailover=Off timeout=5 maxattempts=3     
      #<!--負載均衡-->  
      <Proxy balancer://rescluster/>  
        BalancerMember ajp://res1.***.com:8009 smax=5 max=500 ttl=120 retry=300 loadfactor=100 route=tomcat1  
        BalancerMember ajp://res2.***.com:8009 smax=5 max=500 ttl=120 retry=300 loadfactor=100 route=tomcat2  
      </Proxy>  
      
    </VirtualHost> 
    步驟三,修改業(yè)務邏輯:
      所有上傳文件在數(shù)據(jù)庫中均采用全url的方式保存,例如產(chǎn)品圖片路徑存成:http://res1.***.com/upload/20090101/product120302005.jpg

    現(xiàn)在,你可以高枕無憂了,帶寬不夠時,增加個幾十臺圖片服務器,只需要稍微修改一下apache的配置文件,即可。

    五:高并發(fā)高負載網(wǎng)站的系統(tǒng)架構之數(shù)據(jù)庫集群和庫表散列

    大型網(wǎng)站都有復雜的應用,這些應用必須使用數(shù)據(jù)庫,那么在面對大量訪問的時候,數(shù)據(jù)庫的瓶頸很快就能顯現(xiàn)出來,這時一臺數(shù)據(jù)庫將很快無法滿足應用,于是我們需要使用數(shù)據(jù)庫集群或者庫表散列。
      
      在數(shù)據(jù)庫集群方面,很多數(shù)據(jù)庫都有自己的解決方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是類似的方案,您使用了什么樣的DB,就參考相應的解決方案來實施即可。
      
       上面提到的數(shù)據(jù)庫集群由于在架構、成本、擴張性方面都會受到所采用DB類型的限制,于是我們需要從應用程序的角度來考慮改善系統(tǒng)架構,庫表散列是常用并 且最有效的解決方案。我們在應用程序中安裝業(yè)務和應用或者功能模塊將數(shù)據(jù)庫進行分離,不同的模塊對應不同的數(shù)據(jù)庫或者表,再按照一定的策略對某個頁面或者 功能進行更小的數(shù)據(jù)庫散列,比如用戶表,按照用戶ID進行表散列,這樣就能夠低成本的提升系統(tǒng)的性能并且有很好的擴展性。sohu的論壇就是采用了這樣的 架構,將論壇的用戶、設置、帖子等信息進行數(shù)據(jù)庫分離,然后對帖子、用戶按照板塊和ID進行散列數(shù)據(jù)庫和表,最終可以在配置文件中進行簡單的配置便能讓系 統(tǒng)隨時增加一臺低成本的數(shù)據(jù)庫進來補充系統(tǒng)性能。


    集群軟件的分類:
    一般來講,集群軟件根據(jù)側重的方向和試圖解決的問題,分為三大類:高性能集群(High performance cluster,HPC)、負載均衡集群(Load balance cluster, LBC),高可用性集群(High availability cluster,HAC)。
    高性能集群(High performance cluster,HPC),它是利用一個集群中的多臺機器共同完成同一件任務,使得完成任務的速度和可靠性都遠遠高于單機運行的效果。彌補了單機性能上的不足。該集群在天氣預報、環(huán)境監(jiān)控等數(shù)據(jù)量大,計算復雜的環(huán)境中應用比較多;
    負載均衡集群(Load balance cluster, LBC),它是利用一個集群中的多臺單機,完成許多并行的小的工作。一般情況下,如果一個應用使用的人多了,那么用戶請求的響應時間就會增大,機器的性能也會受到影響,如果使用負載均衡集群,那么集群中任意一臺機器都能響應用戶的請求,這樣集群就會在用戶發(fā)出服務請求之后,選擇當時負載最小,能夠提供最好的服務的這臺機器來接受請求并相應,這樣就可用用集群來增加系統(tǒng)的可用性和穩(wěn)定性。這類集群在網(wǎng)站中使用較多;
    高可用性集群(High availability cluster,HAC),它是利用集群中系統(tǒng) 的冗余,當系統(tǒng)中某臺機器發(fā)生損壞的時候,其他后備的機器可以迅速的接替它來啟動服務,等待故障機的維修和返回。最大限度的保證集群中服務的可用性。這類系統(tǒng)一般在銀行,電信服務這類對系統(tǒng)可靠性有高的要求的領域有著廣泛的應用。
    2 數(shù)據(jù)庫集群的現(xiàn)狀
    數(shù)據(jù)庫集群是將計算機集群技術引入到數(shù)據(jù)庫中來實現(xiàn)的,盡管各廠商宣稱自己的架構如何的完美,但是始終不能改變Oracle當先,大家追逐的事實,在集群的解決方案上Oracle RAC還是領先于包括微軟在內(nèi)的其它數(shù)據(jù)庫廠商,它能滿足客戶高可用性、高性能、數(shù)據(jù)庫負載均衡和方便擴展的需求。
    Oracle’s Real Application Cluster (RAC)
    Microsoft SQL Cluster Server (MSCS)
    IBM’s DB2 UDB High Availability Cluster(UDB)
    Sybase ASE High Availability Cluster (ASE)
    MySQL High Availability Cluster (MySQL CS)
    基于IO的第三方HA(高可用性)集群
    當前主要的數(shù)據(jù)庫集群技術有以上六大類,有數(shù)據(jù)庫廠商自己開發(fā)的;也有第三方的集群公司開發(fā)的;還有數(shù)據(jù)庫廠商與第三方集群公司合作開發(fā)的,各類集群實現(xiàn)的功能及架構也不盡相同。
    RAC(Real Application Cluster,真正應用集群)是Oracle9i數(shù)據(jù)庫中采用的一項新技術,也是Oracle數(shù)據(jù)庫支持網(wǎng)格計算環(huán)境的核心技術。它的出現(xiàn)解決了傳統(tǒng)數(shù)據(jù)庫應用中面臨的一個重要問題:高性能、高可伸縮性與低價格之間的矛盾。在很長一段時間里,甲骨文都以其實時應用集群技術(Real Application Cluster,RAC)統(tǒng)治著集群數(shù)據(jù)庫市場

    六:高并發(fā)高負載網(wǎng)站的系統(tǒng)架構之緩存

    緩存一詞搞技術的都接觸過,很多地方用到緩存。網(wǎng)站架構和網(wǎng)站開發(fā)中的緩存也是非常重要。這里先講述最基本的兩種緩存。高級和分布式的緩存在后面講述。
      架構方面的緩存,對Apache比較熟悉的人都能知道Apache提供了自己的緩存模塊,也可以使用外加的Squid模塊進行緩存,這兩種方式均可以有效的提高Apache的訪問響應能力。
       網(wǎng)站程序開發(fā)方面的緩存,Linux上提供的Memory Cache是常用的緩存接口,可以在web開發(fā)中使用,比如用Java開發(fā)的時候就可以調(diào)用MemoryCache對一些數(shù)據(jù)進行緩存和通訊共享,一些大 型社區(qū)使用了這樣的架構。另外,在使用web語言開發(fā)的時候,各種語言基本都有自己的緩存模塊和方法,PHP有Pear的Cache模塊,Java就更多 了,.net不是很熟悉,相信也肯定有。

     

    Java開源緩存框架
     JBossCache/TreeCache JBossCache是一個復制的事務處理緩存,它允許你緩存企業(yè)級應用數(shù)據(jù)來更好的改善性能。緩存數(shù)據(jù)被自動復制,讓你輕松進行Jboss服務器之間的集群工作。JBossCache能夠通過Jboss應用服務或其他J2EE容器來運行一個Mbean服務,當然,它也能獨立運行。 JBossCache包括兩個模塊:TreeCache和TreeCacheAOP。 TreeCache --是一個樹形結構復制的事務處理緩存。 TreeCacheAOP --是一個“面向?qū)ο?#8221;緩存,它使用AOP來動態(tài)管理POJO
    OSCache OSCache標記庫由OpenSymphony設計,它是一種開創(chuàng)性的JSP定制標記應用,提供了在現(xiàn)有JSP頁面之內(nèi)實現(xiàn)快速內(nèi)存緩沖的功能。OSCache是個一個廣泛采用的高性能的J2EE緩存框架,OSCache能用于任何Java應用程序的普通的緩存解決方案。OSCache有以下特點:緩存任何對象,你可以不受限制的緩存部分jsp頁面或HTTP請求,任何java對象都可以緩存。 擁有全面的API--OSCache API給你全面的程序來控制所有的OSCache特性。 永久緩存--緩存能隨意的寫入硬盤,因此允許昂貴的創(chuàng)建(expensive-to-create)數(shù)據(jù)來保持緩存,甚至能讓應用重啟。 支持集群--集群緩存數(shù)據(jù)能被單個的進行參數(shù)配置,不需要修改代碼。 緩存記錄的過期--你可以有最大限度的控制緩存對象的過期,包括可插入式的刷新策略(如果默認性能不需要時)。
    JCACHE JCACHE是一種即將公布的標準規(guī)范(JSR 107),說明了一種對Java對象臨時在內(nèi)存中進行緩存的方法,包括對象的創(chuàng)建、共享訪問、假脫機(spooling)、失效、各JVM的一致性等。它可被用于緩存JSP內(nèi)最經(jīng)常讀取的數(shù)據(jù),如產(chǎn)品目錄和價格列表。利用JCACHE,多數(shù)查詢的反應時間會因為有緩存的數(shù)據(jù)而加快(內(nèi)部測試表明反應時間大約快15倍)。
    Ehcache Ehcache出自Hibernate,在Hibernate中使用它作為數(shù)據(jù)緩存的解決方案。
    Java Caching System JCS是Jakarta的項目Turbine的子項目。它是一個復合式的緩沖工具。可以將對象緩沖到內(nèi)存、硬盤。具有緩沖對象時間過期設定。還可以通過JCS構建具有緩沖的分布式構架,以實現(xiàn)高性能的應用。 對于一些需要頻繁訪問而每訪問一次都非常消耗資源的對象,可以臨時存放在緩沖區(qū)中,這樣可以提高服務的性能。而JCS正是一個很好的緩沖工具。緩沖工具對于讀操作遠遠多于寫操作的應用性能提高非常顯著。
    SwarmCache SwarmCache是一個簡單而功能強大的分布式緩存機制。它使用IP組播來有效地在緩存的實例之間進行通信。它是快速提高集群式Web應用程序的性能的理想選擇。
    ShiftOne ShiftOne Object Cache這個Java庫提供了基本的對象緩存能力。實現(xiàn)的策略有先進先出(FIFO),最近使用(LRU),最不常使用(LFU)。所有的策略可以最大化元素的大小,最大化其生存時間。
    WhirlyCache Whirlycache是一個快速的、可配置的、存在于內(nèi)存中的對象的緩存。它能夠通過緩存對象來加快網(wǎng)站或應用程序的速度,否則就必須通過查詢數(shù)據(jù)庫或其他代價較高的處理程序來建立。
    Jofti Jofti可對在緩存層中(支持EHCache,JBossCache和OSCache)的對象或在支持Map接口的存儲結構中的對象進行索引與搜索。這個框架還為對象在索引中的增刪改提供透明的功能同樣也為搜索提供易于使用的查詢功能。
    cache4j cache4j是一個有簡單API與實現(xiàn)快速的Java對象緩存。它的特性包括:在內(nèi)存中進行緩存,設計用于多線程環(huán)境,兩種實現(xiàn):同步與阻塞,多種緩存清除策略:LFU, LRU, FIFO,可使用強引用(strong reference)與軟引用(soft reference)存儲對象。
     Open Terracotta 一個JVM級的開源群集框架,提供:HTTP Session復制,分布式緩存,POJO群集,跨越群集的JVM來實現(xiàn)分布式應用程序協(xié)調(diào)(采用代碼注入的方式,所以你不需要修改任何)。
     sccache SHOP.COM使用的對象緩存系統(tǒng)。sccache是一個in-process cache和二級、共享緩存。它將緩存對象存儲到磁盤上。支持關聯(lián)Key,任意大小的Key和任意大小的數(shù)據(jù)。能夠自動進行垃圾收集。
     Shoal Shoal是一個基于Java可擴展的動態(tài)集群框架,能夠為構建容錯、可靠和可用的Java應用程序提供了基礎架構支持。這個框架還可以集成到不希望綁定到特定通信協(xié)議,但需要集群和分布式系統(tǒng)支持的任何Java產(chǎn)品中。Shoal是GlassFish和JonAS應用服務器的集群引擎。
    Simple-Spring-Memcached Simple-Spring-Memcached,它封裝了對MemCached的調(diào)用,使MemCached的客戶端開發(fā)變得超乎尋常的簡單。
     





    http://www.ablanxue.com/prone_1020_1.html
    posted @ 2013-03-21 15:53 abin 閱讀(2003) | 評論 (0)編輯 收藏

    //客戶端代碼,用來測試訪問Servlet:

    package com.abin.lee.ssh.basic.unionpay;

    import java.io.BufferedInputStream;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.List;

    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocket;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.X509TrustManager;

    import org.apache.http.HttpResponse;
    import org.apache.http.HttpVersion;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.params.AllClientPNames;
    import org.apache.http.conn.scheme.Scheme;
    import org.apache.http.conn.ssl.SSLSocketFactory;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.params.BasicHttpParams;
    import org.apache.http.params.HttpParams;
    import org.apache.http.protocol.HTTP;
    import org.junit.Test;

    public class GetUnionpayMessages1Test {
     private static final String HTTPURL = "

     @Test
     public void testGetMessageState() throws Exception {
      HttpClient httpClient = new DefaultHttpClient();
      HttpPost httpPost = new HttpPost(HTTPURL);
      httpClient.getParams().setParameter(AllClientPNames.PROTOCOL_VERSION,
        HttpVersion.HTTP_1_1);
      httpClient.getParams().setParameter(
        AllClientPNames.USE_EXPECT_CONTINUE, Boolean.TRUE);
      httpClient.getParams().setParameter(
        AllClientPNames.HTTP_CONTENT_CHARSET, "UTF_8");
      httpClient.getParams().setParameter(
        AllClientPNames.CONN_MANAGER_TIMEOUT, 10000l);
      httpClient.getParams().setParameter(AllClientPNames.CONNECTION_TIMEOUT,
        2000);
      httpClient.getParams().setParameter(AllClientPNames.SO_TIMEOUT, 10000);
      try {
       TrustManager easyTrustManager = new X509TrustManager() {
        public void checkClientTrusted(X509Certificate[] chain,
          String authType) throws CertificateException {
         // 哦,這很簡單!
        }
        public void checkServerTrusted(X509Certificate[] chain,
          String authType) throws CertificateException {
          //哦,這很簡單!
        }
        public X509Certificate[] getAcceptedIssuers() {
         return null;
        }
       };
       SSLContext sslcontext = SSLContext.getInstance("TLS");
       sslcontext
         .init(null, new TrustManager[] { easyTrustManager }, null);
       SSLSocketFactory sf = new SSLSocketFactory(sslcontext);
       SSLSocket socket = (SSLSocket) sf.createSocket();
       socket.setEnabledCipherSuites(new String[] { "SSL_RSA_WITH_RC4_128_MD5" });
       HttpParams params = new BasicHttpParams();
       Scheme sch = new Scheme("https", 1443, sf);
       sf.connectSocket(socket, "124.288.188.28", 1443, null, -1, params);

       httpClient.getConnectionManager().getSchemeRegistry().register(sch);

       List<NameValuePair> nvps = new ArrayList<NameValuePair>();
       nvps.add(new BasicNameValuePair("userName", "abin"));
       nvps.add(new BasicNameValuePair("createTime", new SimpleDateFormat(
         "yyyy-MM-dd HH:mm:ss").format(new java.util.Date())));
       HttpResponse httpResponse = null;
       String result = "";
       try {
        httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
        httpResponse = httpClient.execute(httpPost);
        BufferedInputStream buffer = new BufferedInputStream(
          httpResponse.getEntity().getContent());
        byte[] bytes = new byte[1024];
        int line = 0;
        StringBuilder builder = new StringBuilder();
        while ((line = buffer.read(bytes)) != -1) {
         builder.append(new String(bytes, 0, line, "UTF-8"));
        }
        result = builder.toString();
       } catch (Exception e) {
        e.printStackTrace();
       } finally {
        if (httpPost.isAborted()) {
         httpPost.abort();
        }
        httpClient.getConnectionManager().shutdown();
       }
       System.out.println("result=" + result);

      } finally {
       // When HttpClient instance is no longer needed,
       // shut down the connection manager to ensure
       // immediate deallocation of all system resources
       httpClient.getConnectionManager().shutdown();
      }
     }
    }





    //在%TOMCAT_HOME%/conf/server.xml里面添加的內(nèi)容

    <Connector port="1443" protocol="HTTP/1.1" SSLEnabled="true"
         maxThreads="150" scheme="https" secure="true"
         clientAuth="false" keystoreFile="D:/tomcat.keystore"
         keystorePass="longcode" sslProtocol="TLS" />





    //UnionPayDeal.java

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;

    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /**
     *
     * @author Administrator
     *
     */
    public class UnionPayDeal extends HttpServlet {
     private static final long serialVersionUID = -1370581177759574628L;

     public void init(ServletConfig config) throws ServletException {
      super.init(config);
     }

     public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException{
      System.out.println("接收到銀聯(lián)的異步通知");
      String accept=null;
      BufferedReader reader=new BufferedReader(new InputStreamReader(request.getInputStream()));
      int num=0;
      char[] buffer=new char[1024];
      while((num=reader.read(buffer))!=-1){
       accept=new String(buffer,0,num);
       System.out.println("accept="+accept);
      }
     }
     
     
     public void destroy() {
      super.destroy();
     }
    }


     


    //客戶端代碼,用來測試訪問Servlet:

    package com.abin.lee.ssh.basic.https;

    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.security.KeyStore;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.List;

    import org.apache.http.HttpResponse;
    import org.apache.http.HttpVersion;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.params.AllClientPNames;
    import org.apache.http.conn.scheme.Scheme;
    import org.apache.http.conn.ssl.SSLSocketFactory;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.protocol.HTTP;
    import org.junit.Test;

    public class GetUnionpayMessageTest {
     private static final String HTTPURL = "

     @Test
     public void testGetMessageState() throws Exception {
      HttpClient httpClient = new DefaultHttpClient();
      HttpPost httpPost =new HttpPost(HTTPURL);
            httpClient.getParams().setParameter(AllClientPNames.PROTOCOL_VERSION,HttpVersion.HTTP_1_1);
            httpClient.getParams().setParameter(AllClientPNames.USE_EXPECT_CONTINUE, Boolean.TRUE);
            httpClient.getParams().setParameter(AllClientPNames.HTTP_CONTENT_CHARSET,"UTF_8");
            httpClient.getParams().setParameter(AllClientPNames.CONN_MANAGER_TIMEOUT, 10000l);
            httpClient.getParams().setParameter(AllClientPNames.CONNECTION_TIMEOUT, 2000);
            httpClient.getParams().setParameter(AllClientPNames.SO_TIMEOUT, 10000);
      try {
       KeyStore trustStore = KeyStore.getInstance(KeyStore
         .getDefaultType());
       FileInputStream instream = new FileInputStream(new File(
         "D:/tomcat.keystore"));
       try {
        trustStore.load(instream, "longcode".toCharArray());
       } finally {
        try {
         instream.close();
        } catch (Exception ignore) {
        }
       }

       SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
       Scheme sch = new Scheme("https", 1443, socketFactory);
       httpClient.getConnectionManager().getSchemeRegistry().register(sch);

       List<NameValuePair> nvps = new ArrayList<NameValuePair>();
       nvps.add(new BasicNameValuePair("userName", "abin"));
       nvps.add(new BasicNameValuePair("createTime", new SimpleDateFormat(
         "yyyy-MM-dd HH:mm:ss").format(new java.util.Date())));
       HttpResponse httpResponse = null;
       String result = "";
       try {
        httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
        httpResponse = httpClient.execute(httpPost);
        BufferedInputStream buffer = new BufferedInputStream(
          httpResponse.getEntity().getContent());
        byte[] bytes = new byte[1024];
        int line = 0;
        StringBuilder builder = new StringBuilder();
        while ((line = buffer.read(bytes)) != -1) {
         builder.append(new String(bytes, 0, line, "UTF-8"));
        }
        result = builder.toString();
       } catch (Exception e) {
        e.printStackTrace();
       } finally {
        if (httpPost.isAborted()) {
         httpPost.abort();
        }
        httpClient.getConnectionManager().shutdown();
       }
       System.out.println("result=" + result);

      } finally {
       // When HttpClient instance is no longer needed,
       // shut down the connection manager to ensure
       // immediate deallocation of all system resources
       httpClient.getConnectionManager().shutdown();
      }
     }
    }




    //在%TOMCAT_HOME%/conf/server.xml里面添加的內(nèi)容

    <Connector port="1443" protocol="HTTP/1.1" SSLEnabled="true"
         maxThreads="150" scheme="https" secure="true"
         clientAuth="false" keystoreFile="D:/tomcat.keystore"
         keystorePass="longcode" sslProtocol="TLS" />





    //UnionPayDeal.java

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;

    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /**
     *
     * @author Administrator
     *
     */
    public class UnionPayDeal extends HttpServlet {
     private static final long serialVersionUID = -1370581177759574628L;

     public void init(ServletConfig config) throws ServletException {
      super.init(config);
     }

     public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException{
      System.out.println("接收到銀聯(lián)的異步通知");
      String accept=null;
      BufferedReader reader=new BufferedReader(new InputStreamReader(request.getInputStream()));
      int num=0;
      char[] buffer=new char[1024];
      while((num=reader.read(buffer))!=-1){
       accept=new String(buffer,0,num);
       System.out.println("accept="+accept);
      }
     }
     
     
     public void destroy() {
      super.destroy();
     }
    }


     


    這段時間遇到一個問題,程序里明明插入了一條記錄,但在后邊的一段Procedure中卻查不到剛剛插入的記錄,最后發(fā)現(xiàn)這個Procedure的定義中加入了PRAGMA AUTONOMOUS_TRANSACTION

    PRAGMA AUTONOMOUS_TRANSACTION中文翻譯過來叫“自治事務”(翻譯的還算好理解),對于定義成自治事務的Procedure,實際上相當于一段獨立運行的程序段,這段程序不依賴于主程序,也不干涉主程序



    自治事務的特點

    第一,這段程序不依賴于原有Main程序,比如Main程序中有未提交的數(shù)據(jù),那么在自治事務中是查找不到的。

    第二,在自治事務中,commit或者rollback只會提交或回滾當前自治事務中的DML,不會影響到Main程序中的DML。


    Autonomous Transaction Demo 1

    Without Pragma Autonomous Transaction

    CREATE TABLE t (  
    test_value VARCHAR2(25));  
      
    CREATE OR REPLACE PROCEDURE child_block IS  
      
    BEGIN  
      INSERT INTO t  
      (test_value)  
      VALUES  
      ('Child block insert');  
      COMMIT;  
    END child_block;  
    /  
      
    CREATE OR REPLACE PROCEDURE parent_block IS  
      
    BEGIN  
      INSERT INTO t  
      (test_value)  
      VALUES  
      ('Parent block insert');  
      
       child_block;  
      
       ROLLBACK;  
    END parent_block;  
    /  
      
    -- run the parent procedure   
    exec parent_block  
      
    -- check the results   
    SELECT * FROM t;  



    Output:  
    Parent block insert  
    Child block insert  




    With Pragma Autonomous Transaction

    CREATE OR REPLACE PROCEDURE child_block IS  
      
    PRAGMA AUTONOMOUS_TRANSACTION;  
      
    BEGIN  
      INSERT INTO t  
      (test_value)  
      VALUES  
      ('Child block insert');  
      
      COMMIT;  
    END child_block;  
    /  
      
    CREATE OR REPLACE PROCEDURE parent_block IS  
      
    BEGIN  
      INSERT INTO t  
      (test_value)  
      VALUES  
      ('Parent block insert');  
      
       child_block;  
      
       ROLLBACK;  
    END parent_block;  
    /  
    -- empty the test table   
    TRUNCATE TABLE t;  
      
    -- run the parent procedure   
    exec parent_block;  
      
    -- check the results   
    SELECT * FROM t;  

     



    Output:  
    Child block insert  



    Autonomous Transaction Demo 2

    Without Pragma Autonomous Transaction
    DROP TABLE t; 
     
    CREATE TABLE t (testcol NUMBER); 
     
    CREATE OR REPLACE FUNCTION howmanyrows RETURN INTEGER IS 
     i INTEGER; 
    BEGIN 
      SELECT COUNT(*) 
      INTO i 
      FROM t; 
     
      RETURN i; 
    END howmanyrows; 

     
    CREATE OR REPLACE PROCEDURE testproc IS 
     a INTEGER; 
     b INTEGER; 
     c INTEGER; 
    BEGIN 
      SELECT COUNT(*) 
      INTO a 
      FROM t; 
     
      INSERT INTO t VALUES (1); 
      COMMIT; 
     
      INSERT INTO t VALUES (2); 
      INSERT INTO t VALUES (3); 
     
      b := howmanyrows; 
     
      INSERT INTO t VALUES (4); 
      INSERT INTO t VALUES (5); 
      INSERT INTO t VALUES (6); 
      COMMIT; 
     
      SELECT COUNT(*) 
      INTO c 
      FROM t; 
     
      dbms_output.put_line(a); 
      dbms_output.put_line(b); 
      dbms_output.put_line(c); 
    END testproc; 

     
    set serveroutput on 
     
    exec testproc 




    Output:  
    0  
    3  
    6  
    Total execution time 2.782 sec.  




    With Pragma Autonomous Transaction



    Output:  
    0  
    1  
    6  




    轉(zhuǎn)載請注明出處:http://blog.csdn.net/pan_tian/article/details/7675800




    posted @ 2013-03-08 16:29 abin 閱讀(490) | 評論 (0)編輯 收藏

    package com.abin.lee.ssh.basic.train;

    import java.io.BufferedInputStream;
    import java.util.ArrayList;
    import java.util.List;

    import org.apache.http.HttpResponse;
    import org.apache.http.HttpVersion;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.params.AllClientPNames;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.protocol.HTTP;
    import org.junit.Test;

    public class CityToCityTest {
     private static final String HTTPURL="http://localhost:7500/train/mvc/train/searchTrain2";
     @Test
     public void testCityToCity(){

       HttpClient httpClient = new DefaultHttpClient();
       HttpPost httpPost =new HttpPost(HTTPURL);
       httpClient.getParams().setParameter(AllClientPNames.PROTOCOL_VERSION,HttpVersion.HTTP_1_1);
       httpClient.getParams().setParameter(AllClientPNames.USE_EXPECT_CONTINUE, Boolean.TRUE);
       httpClient.getParams().setParameter(AllClientPNames.HTTP_CONTENT_CHARSET,HTTP.UTF_8);
       httpClient.getParams().setParameter(AllClientPNames.CONN_MANAGER_TIMEOUT,1000l);
       httpClient.getParams().setParameter(AllClientPNames.CONNECTION_TIMEOUT, 2000);
       httpClient.getParams().setParameter(AllClientPNames.SO_TIMEOUT, 10000);
       List<NameValuePair> nvps = new ArrayList<NameValuePair>();
       nvps.add(new BasicNameValuePair("terminalId", "132456"));
       nvps.add(new BasicNameValuePair("startCity", "北京"));
       nvps.add(new BasicNameValuePair("endCity", "上海"));
       nvps.add(new BasicNameValuePair("trainNumber", "T284"));
       nvps.add(new BasicNameValuePair("searchType", "0"));
       HttpResponse httpResponse =null;
       String result="";
       try {
        httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
        httpResponse = httpClient.execute(httpPost);
        BufferedInputStream buffer=new BufferedInputStream(httpResponse.getEntity().getContent());
        byte[] bytes=new byte[1024];
        int line=0;
        StringBuilder builder=new StringBuilder();
        while((line=buffer.read(bytes))!=-1){
         builder.append(new String(bytes,0,line,"UTF-8"));
        }
        result=builder.toString();
       } catch (Exception e) {
        e.printStackTrace();
       }finally{
        if(httpPost.isAborted()){
         httpPost.abort();
        }
        httpClient.getConnectionManager().shutdown();
       }
       System.out.println("result="+result);
     
     }

    }

    posted @ 2013-03-05 12:26 abin 閱讀(3809) | 評論 (0)編輯 收藏

    十八.  和系統(tǒng)運行狀況相關的Shell命令:

        1.  Linux的實時監(jiān)測命令(watch):
        watch 是一個非常實用的命令,可以幫你實時監(jiān)測一個命令的運行結果,省得一遍又一遍的手動運行。該命令最為常用的兩個選項是-d和-n,其中-n表示間隔多少秒執(zhí)行一次"command",-d表示高亮發(fā)生變化的位置。下面列舉幾個在watch中常用的實時監(jiān)視命令:
        /> watch -d -n 1 'who'   #每隔一秒執(zhí)行一次who命令,以監(jiān)視服務器當前用戶登錄的狀況
        Every 1.0s: who       Sat Nov 12 12:37:18 2011
        
        stephen  tty1           2011-11-11 17:38 (:0)
        stephen  pts/0         2011-11-11 17:39 (:0.0)
        root       pts/1         2011-11-12 10:01 (192.168.149.1)
        root       pts/2         2011-11-12 11:41 (192.168.149.1)
        root       pts/3         2011-11-12 12:11 (192.168.149.1)
        stephen  pts/4         2011-11-12 12:22 (:0.0)
        此時通過其他Linux客戶端工具以root的身份登錄當前Linux服務器,再觀察watch命令的運行變化。
        Every 1.0s: who       Sat Nov 12 12:41:09 2011
        
        stephen  tty1          2011-11-11 17:38 (:0)
        stephen  pts/0        2011-11-11 17:39 (:0.0)
        root       pts/1        2011-11-12 10:01 (192.168.149.1)
        root       pts/2        2011-11-12 11:41 (192.168.149.1)
        root       pts/3        2011-11-12 12:40 (192.168.149.1)
        stephen  pts/4        2011-11-12 12:22 (:0.0)
        root       pts/5        2011-11-12 12:41 (192.168.149.1)
        最后一行中被高亮的用戶為新登錄的root用戶。此時按CTRL + C可以退出正在執(zhí)行的watch監(jiān)控進程。
       
        #watch可以同時運行多個命令,命令間用分號分隔。
        #以下命令監(jiān)控磁盤的使用狀況,以及當前目錄下文件的變化狀況,包括文件的新增、刪除和文件修改日期的更新等。
        /> watch -d -n 1 'df -h; ls -l'
        Every 1.0s: df -h; ls -l     Sat Nov 12 12:55:00 2011
        
        Filesystem            Size  Used Avail Use% Mounted on
        /dev/sda1             5.8G  3.3G  2.2G  61% /
        tmpfs                 504M  420K  504M   1% /dev/shm
        total 20
        -rw-r--r--. 1 root root 10530 Nov 11 23:08 test.tar.bz2
        -rw-r--r--. 1 root root   183 Nov 11 08:02 users
        -rw-r--r--. 1 root root   279 Nov 11 08:45 users2
        此時通過另一個Linux控制臺窗口,在watch監(jiān)視的目錄下,如/home/stephen/test,執(zhí)行下面的命令
        /> touch aa         #在執(zhí)行該命令之后,另一個執(zhí)行watch命令的控制臺將有如下變化
        Every 1.0s: df -h; ls -l                                Sat Nov 12 12:57:08 2011
        
        Filesystem            Size  Used Avail Use% Mounted on
        /dev/sda1             5.8G  3.3G  2.2G  61% /
        tmpfs                 504M  420K  504M   1% /dev/shm
        total 20
        -rw-r--r--. 1 root root        0 Nov 12 12:56 aa
        -rw-r--r--. 1 root root        0 Nov 12 10:02 datafile3
        -rw-r--r--. 1 root root 10530 Nov 11 23:08 test.tar.bz2
        -rw-r--r--. 1 root root     183 Nov 11 08:02 users
        -rw-r--r--. 1 root root     279 Nov 11 08:45 users2
        其中黃色高亮的部分,為touch aa命令執(zhí)行之后watch輸出的高亮變化部分。

       
        2.  查看當前系統(tǒng)內(nèi)存使用狀況(free)
        free命令有以下幾個常用選項:

    選項 說明
    -b 以字節(jié)為單位顯示數(shù)據(jù)。
    -k 以千字節(jié)(KB)為單位顯示數(shù)據(jù)(缺省值)。
    -m 以兆(MB)為單位顯示數(shù)據(jù)。
    -s delay 該選項將使free持續(xù)不斷的刷新,每次刷新之間的間隔為delay指定的秒數(shù),如果含有小數(shù)點,將精確到毫秒,如0.5為500毫秒,1為一秒。

        free命令輸出的表格中包含以下幾列:

    列名 說明
    total 總計物理內(nèi)存的大小。
    used 已使用的內(nèi)存數(shù)量。
    free 可用的內(nèi)存數(shù)量。
    Shared 多個進程共享的內(nèi)存總額。
    Buffers/cached 磁盤緩存的大小。


        見以下具體示例和輸出說明:
        /> free -k
                            total         used          free     shared    buffers     cached
        Mem:       1031320     671776     359544          0      88796     352564
        -/+ buffers/cache:      230416     800904
        Swap:        204792              0     204792
        對于free命令的輸出,我們只需關注紅色高亮的輸出行和綠色高亮的輸出行,見如下具體解釋:
        紅色輸出行:該行使從操作系統(tǒng)的角度來看待輸出數(shù)據(jù)的,used(671776)表示內(nèi)核(Kernel)+Applications+buffers+cached。free(359544)表示系統(tǒng)還有多少內(nèi)存可供使用。
        綠色輸出行:該行則是從應用程序的角度來看輸出數(shù)據(jù)的。其free = 操作系統(tǒng)used + buffers + cached,既:
        800904 = 359544 + 88796 + 352564
        /> free -m
                          total        used        free      shared    buffers     cached
        Mem:          1007         656        351            0         86            344
        -/+ buffers/cache:        225        782
        Swap:          199             0        199
        /> free -k -s 1.5  #以千字節(jié)(KB)為單位顯示數(shù)據(jù),同時每隔1.5刷新輸出一次,直到按CTRL+C退出
                          total        used       free     shared    buffers     cached
        Mem:          1007         655        351          0           86        344
        -/+ buffers/cache:        224        782
        Swap:          199             0        199

                          total        used       free     shared    buffers     cached
        Mem:          1007         655        351          0           86        344
        -/+ buffers/cache:        224        782
        Swap:          199             0        199

        3.  CPU的實時監(jiān)控工具(mpstat)
        該命令主要用于報告當前系統(tǒng)中所有CPU的實時運行狀況。
        #該命令將每隔2秒輸出一次CPU的當前運行狀況信息,一共輸出5次,如果沒有第二個數(shù)字參數(shù),mpstat將每隔兩秒執(zhí)行一次,直到按CTRL+C退出。
        /> mpstat 2 5  
        Linux 2.6.32-71.el6.i686 (Stephen-PC)   11/12/2011      _i686_  (1 CPU)

        04:03:00 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
        04:03:02 PM  all    0.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00   99.50
        04:03:04 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
        04:03:06 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
        04:03:08 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
        04:03:10 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
        Average:       all    0.00    0.00    0.10    0.00    0.00    0.00    0.00    0.00   99.90

        第一行的末尾給出了當前系統(tǒng)中CPU的數(shù)量。后面的表格中則輸出了系統(tǒng)當前CPU的使用狀況,以下為每列的含義:

    列名 說明
    %user 在internal時間段里,用戶態(tài)的CPU時間(%),不包含nice值為負進程  (usr/total)*100
    %nice 在internal時間段里,nice值為負進程的CPU時間(%)   (nice/total)*100
    %sys 在internal時間段里,內(nèi)核時間(%)       (system/total)*100
    %iowait 在internal時間段里,硬盤IO等待時間(%) (iowait/total)*100
    %irq 在internal時間段里,硬中斷時間(%)     (irq/total)*100
    %soft 在internal時間段里,軟中斷時間(%)     (softirq/total)*100
    %idle 在internal時間段里,CPU除去等待磁盤IO操作外的因為任何原因而空閑的時間閑置時間(%) (idle/total)*100

        計算公式:
        total_cur=user+system+nice+idle+iowait+irq+softirq
        total_pre=pre_user+ pre_system+ pre_nice+ pre_idle+ pre_iowait+ pre_irq+ pre_softirq
        user=user_cur – user_pre
        total=total_cur-total_pre
        其中_cur 表示當前值,_pre表示interval時間前的值。上表中的所有值可取到兩位小數(shù)點。    

        /> mpstat -P ALL 2 3  #-P ALL表示打印所有CPU的數(shù)據(jù),這里也可以打印指定編號的CPU數(shù)據(jù),如-P 0(CPU的編號是0開始的)
        Linux 2.6.32-71.el6.i686 (Stephen-PC)   11/12/2011      _i686_  (1 CPU)

        04:12:54 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
        04:12:56 PM    all      0.00      0.00     0.50    0.00      0.00    0.00    0.00      0.00     99.50
        04:12:56 PM      0     0.00      0.00     0.50    0.00      0.00    0.00    0.00      0.00     99.50

        04:12:56 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
        04:12:58 PM    all     0.00      0.00     0.00    0.00      0.00    0.00    0.00      0.00    100.00
        04:12:58 PM     0     0.00      0.00     0.00    0.00      0.00    0.00    0.00      0.00    100.00

        04:12:58 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
        04:13:00 PM    all      0.00     0.00    0.00    0.00      0.00    0.00     0.00      0.00    100.00
        04:13:00 PM     0      0.00     0.00    0.00    0.00      0.00    0.00     0.00      0.00    100.00

        Average:       CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
        Average:         all      0.00     0.00    0.17    0.00      0.00    0.00     0.00      0.00     99.83
        Average:          0      0.00     0.00    0.17    0.00      0.00    0.00     0.00      0.00     99.83

        4.  虛擬內(nèi)存的實時監(jiān)控工具(vmstat)
        vmstat命令用來獲得UNIX系統(tǒng)有關進程、虛存、頁面交換空間及CPU活動的信息。這些信息反映了系統(tǒng)的負載情況。vmstat首次運行時顯示自系統(tǒng)啟動開始的各項統(tǒng)計信息,之后運行vmstat將顯示自上次運行該命令以后的統(tǒng)計信息。用戶可以通過指定統(tǒng)計的次數(shù)和時間來獲得所需的統(tǒng)計信息。
        /> vmstat 1 3    #這是vmstat最為常用的方式,其含義為每隔1秒輸出一條,一共輸出3條后程序退出。
        procs  -----------memory----------   ---swap-- -----io---- --system-- -----cpu-----
         r  b   swpd      free      buff   cache   si   so     bi    bo     in   cs  us  sy id  wa st
         0  0        0 531760  67284 231212  108  0     0  260   111  148  1   5 86   8  0
         0  0        0 531752  67284 231212    0    0     0     0     33   57   0   1 99   0  0
         0  0        0 531752  67284 231212    0    0     0     0     40   73   0   0 100 0  0

        /> vmstat 1       #其含義為每隔1秒輸出一條,直到按CTRL+C后退出。

        下面將給出輸出表格中每一列的含義說明:
        有關進程的信息有:(procs)
        r:  在就緒狀態(tài)等待的進程數(shù)。
        b: 在等待狀態(tài)等待的進程數(shù)。   
        有關內(nèi)存的信息有:(memory)
        swpd:  正在使用的swap大小,單位為KB。
        free:    空閑的內(nèi)存空間。
        buff:    已使用的buff大小,對塊設備的讀寫進行緩沖。
        cache: 已使用的cache大小,文件系統(tǒng)的cache。
        有關頁面交換空間的信息有:(swap)
        si:  交換內(nèi)存使用,由磁盤調(diào)入內(nèi)存。
        so: 交換內(nèi)存使用,由內(nèi)存調(diào)入磁盤。 
        有關IO塊設備的信息有:(io)
        bi:  從塊設備讀入的數(shù)據(jù)總量(讀磁盤) (KB/s)
        bo: 寫入到塊設備的數(shù)據(jù)總理(寫磁盤) (KB/s)  
        有關故障的信息有:(system)
        in: 在指定時間內(nèi)的每秒中斷次數(shù)。
        sy: 在指定時間內(nèi)每秒系統(tǒng)調(diào)用次數(shù)。
        cs: 在指定時間內(nèi)每秒上下文切換的次數(shù)。  
        有關CPU的信息有:(cpu)
        us:  在指定時間間隔內(nèi)CPU在用戶態(tài)的利用率。
        sy:  在指定時間間隔內(nèi)CPU在核心態(tài)的利用率。
        id:  在指定時間間隔內(nèi)CPU空閑時間比。
        wa: 在指定時間間隔內(nèi)CPU因為等待I/O而空閑的時間比。  
        vmstat 可以用來確定一個系統(tǒng)的工作是受限于CPU還是受限于內(nèi)存:如果CPU的sy和us值相加的百分比接近100%,或者運行隊列(r)中等待的進程數(shù)總是不等于0,且經(jīng)常大于4,同時id也經(jīng)常小于40,則該系統(tǒng)受限于CPU;如果bi、bo的值總是不等于0,則該系統(tǒng)受限于內(nèi)存。

        5.  設備IO負載的實時監(jiān)控工具(iostat)
        iostat主要用于監(jiān)控系統(tǒng)設備的IO負載情況,iostat首次運行時顯示自系統(tǒng)啟動開始的各項統(tǒng)計信息,之后運行iostat將顯示自上次運行該命令以后的統(tǒng)計信息。用戶可以通過指定統(tǒng)計的次數(shù)和時間來獲得所需的統(tǒng)計信息。
        其中該命令中最為常用的使用方式如下:
        /> iostat -d 1 3    #僅顯示設備的IO負載,其中每隔1秒刷新并輸出結果一次,輸出3次后iostat退出。
        Linux 2.6.32-71.el6.i686 (Stephen-PC)   11/16/2011      _i686_  (1 CPU)

        Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
        sda                 5.35       258.39        26.19     538210      54560

        Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
        sda                 0.00         0.00         0.00                  0          0

        Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
        sda                 0.00         0.00         0.00                  0          0

        Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
        sda                 0.00         0.00         0.00                  0          0
        /> iostat -d 1  #和上面的命令一樣,也是每隔1秒刷新并輸出一次,但是該命令將一直輸出,直到按CTRL+C退出。
        下面將給出輸出表格中每列的含義:

    列名 說明
    Blk_read/s 每秒塊(扇區(qū))讀取的數(shù)量。
    Blk_wrtn/s 每秒塊(扇區(qū))寫入的數(shù)量。
    Blk_read 總共塊(扇區(qū))讀取的數(shù)量。
    Blk_wrtn 總共塊(扇區(qū))寫入的數(shù)量。

        iostat還有一個比較常用的選項-x,該選項將用于顯示和io相關的擴展數(shù)據(jù)。
        /> iostat -dx 1 3
        Device:  rrqm/s wrqm/s  r/s   w/s  rsec/s wsec/s avgrq-sz avgqu-sz   await  svctm  %util
        sda            5.27   1.31 2.82 1.14 189.49  19.50    52.75     0.53     133.04  10.74   4.26

        Device:  rrqm/s wrqm/s  r/s   w/s  rsec/s wsec/s avgrq-sz avgqu-sz   await  svctm  %util
        sda            0.00   0.00 0.00 0.00   0.00   0.00        0.00     0.00         0.00   0.00   0.00

        Device:  rrqm/s wrqm/s  r/s   w/s  rsec/s wsec/s avgrq-sz avgqu-sz   await  svctm  %util
        sda            0.00   0.00 0.00 0.00   0.00   0.00        0.00     0.00         0.00   0.00   0.00
        還可以在命令行參數(shù)中指定要監(jiān)控的設備名,如:
        /> iostat -dx sda 1 3   #指定監(jiān)控的設備名稱為sda,該命令的輸出結果和上面命令完全相同。

        下面給出擴展選項輸出的表格中每列的含義:

    列名 說明
    rrqm/s 隊列中每秒鐘合并的讀請求數(shù)量
    wrqm/s 隊列中每秒鐘合并的寫請求數(shù)量
    r/s 每秒鐘完成的讀請求數(shù)量
    w/s 每秒鐘完成的寫請求數(shù)量
    rsec/s 每秒鐘讀取的扇區(qū)數(shù)量
    wsec/s 每秒鐘寫入的扇區(qū)數(shù)量
    avgrq-sz 平均請求扇區(qū)的大小
    avgqu-sz 平均請求隊列的長度
    await 平均每次請求的等待時間
    util 設備的利用率

        下面是關鍵列的解釋:
        util是設備的利用率。如果它接近100%,通常說明設備能力趨于飽和。
        await是平均每次請求的等待時間。這個時間包括了隊列時間和服務時間,也就是說,一般情況下,await大于svctm,它們的差值越小,則說明隊列時間越短,反之差值越大,隊列時間越長,說明系統(tǒng)出了問題。
        avgqu-sz是平均請求隊列的長度。毫無疑問,隊列長度越短越好。                 

         6.  當前運行進程的實時監(jiān)控工具(pidstat)
         pidstat主要用于監(jiān)控全部或指定進程占用系統(tǒng)資源的情況,如CPU,內(nèi)存、設備IO、任務切換、線程等。pidstat首次運行時顯示自系統(tǒng)啟動開始的各項統(tǒng)計信息,之后運行pidstat將顯示自上次運行該命令以后的統(tǒng)計信息。用戶可以通過指定統(tǒng)計的次數(shù)和時間來獲得所需的統(tǒng)計信息。
        在正常的使用,通常都是通過在命令行選項中指定待監(jiān)控的pid,之后在通過其他具體的參數(shù)來監(jiān)控與該pid相關系統(tǒng)資源信息。

    選項 說明
    -l 顯示該進程和CPU相關的信息(command列中可以顯示命令的完整路徑名和命令的參數(shù))。
    -d 顯示該進程和設備IO相關的信息。
    -r 顯示該進程和內(nèi)存相關的信息。
    -w 顯示該進程和任務時間片切換相關的信息。
    -t 顯示在該進程內(nèi)正在運行的線程相關的信息。
    -p 后面緊跟著帶監(jiān)控的進程id或ALL(表示所有進程),如不指定該選項,將監(jiān)控當前系統(tǒng)正在運行的所有進程。

        #監(jiān)控pid為1(init)的進程的CPU資源使用情況,其中每隔3秒刷新并輸出一次,3次后程序退出。
        /> pidstat -p 1 2 3 -l
        07:18:58 AM       PID    %usr %system  %guest    %CPU   CPU  Command
        07:18:59 AM         1    0.00    0.00    0.00    0.00     0  /sbin/init
        07:19:00 AM         1    0.00    0.00    0.00    0.00     0  /sbin/init
        07:19:01 AM         1    0.00    0.00    0.00    0.00     0  /sbin/init
        Average:               1    0.00    0.00    0.00    0.00     -  /sbin/init
        %usr:      該進程在用戶態(tài)的CPU使用率。
        %system:該進程在內(nèi)核態(tài)(系統(tǒng)級)的CPU使用率。
        %CPU:     該進程的總CPU使用率,如果在SMP環(huán)境下,該值將除以CPU的數(shù)量,以表示每CPU的數(shù)據(jù)。
        CPU:         該進程所依附的CPU編號(0表示第一個CPU)。

        #監(jiān)控pid為1(init)的進程的設備IO資源負載情況,其中每隔2秒刷新并輸出一次,3次后程序退出。
        /> pidstat -p 1 2 3 -d    
        07:24:49 AM       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
        07:24:51 AM         1      0.00      0.00      0.00  init
        07:24:53 AM         1      0.00      0.00      0.00  init
        07:24:55 AM         1      0.00      0.00      0.00  init
        Average:               1      0.00      0.00      0.00  init
        kB_rd/s:   該進程每秒的字節(jié)讀取數(shù)量(KB)。
        kB_wr/s:   該進程每秒的字節(jié)寫出數(shù)量(KB)。
        kB_ccwr/s: 該進程每秒取消磁盤寫入的數(shù)量(KB)。

        #監(jiān)控pid為1(init)的進程的內(nèi)存使用情況,其中每隔2秒刷新并輸出一次,3次后程序退出。
        /> pidstat -p 1 2 3 -r
        07:29:56 AM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
        07:29:58 AM         1      0.00      0.00    2828   1368   0.13  init
        07:30:00 AM         1      0.00      0.00    2828   1368   0.13  init
        07:30:02 AM         1      0.00      0.00    2828   1368   0.13  init
        Average:               1      0.00      0.00    2828   1368   0.13  init
        %MEM:  該進程的內(nèi)存使用百分比。

        #監(jiān)控pid為1(init)的進程任務切換情況,其中每隔2秒刷新并輸出一次,3次后程序退出。
        /> pidstat -p 1 2 3 -w
        07:32:15 AM       PID   cswch/s nvcswch/s  Command
        07:32:17 AM         1      0.00      0.00  init
        07:32:19 AM         1      0.00      0.00  init
        07:32:21 AM         1      0.00      0.00  init
        Average:            1      0.00      0.00  init
        cswch/s:    每秒任務主動(自愿的)切換上下文的次數(shù)。主動切換是指當某一任務處于阻塞等待時,將主動讓出自己的CPU資源。
        nvcswch/s: 每秒任務被動(不自愿的)切換上下文的次數(shù)。被動切換是指CPU分配給某一任務的時間片已經(jīng)用完,因此將強迫該進程讓出CPU的執(zhí)行權。

        #監(jiān)控pid為1(init)的進程及其內(nèi)部線程的內(nèi)存(r選項)使用情況,其中每隔2秒刷新并輸出一次,3次后程序退出。需要說明的是,如果-t選項后面不加任何其他選項,缺省監(jiān)控的為CPU資源。結果中黃色高亮的部分表示進程和其內(nèi)部線程是樹狀結構的顯示方式。
        /> pidstat -p 1 2 3 -tr
        Linux 2.6.32-71.el6.i686 (Stephen-PC)   11/16/2011      _i686_  (1 CPU)

        07:37:04 AM      TGID       TID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
        07:37:06 AM         1         -      0.00      0.00        2828   1368      0.13  init
        07:37:06 AM         -         1      0.00      0.00        2828   1368      0.13  |__init

        07:37:06 AM      TGID       TID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
        07:37:08 AM         1         -      0.00      0.00        2828   1368      0.13  init
        07:37:08 AM         -         1      0.00      0.00        2828   1368      0.13  |__init

        07:37:08 AM      TGID       TID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
        07:37:10 AM         1         -      0.00      0.00        2828   1368      0.13  init
        07:37:10 AM         -         1      0.00      0.00        2828   1368      0.13  |__init

        Average:         TGID       TID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
        Average:            1         -      0.00      0.00        2828   1368      0.13  init
        Average:            -         1      0.00      0.00        2828   1368      0.13  |__init
        TGID: 線程組ID。
        TID: 線程ID。  

        以上監(jiān)控不同資源的選項可以同時存在,這樣就將在一次輸出中輸出多種資源的使用情況,如:pidstat -p 1 -dr。

        7.  報告磁盤空間使用狀況(df):
        該命令最為常用的選項就是-h,該選項將智能的輸出數(shù)據(jù)單位,以便使輸出的結果更具可讀性。
        /> df -h
        Filesystem             Size  Used   Avail Use% Mounted on
        /dev/sda1             5.8G  3.3G  2.2G  61%   /
        tmpfs                  504M  260K  504M   1%  /dev/shm

        8.  評估磁盤的使用狀況(du)

    選項 說明
    -a 包括了所有的文件,而不只是目錄。
    -b 以字節(jié)為計算單位。
    -k 以千字節(jié)(KB)為計算單位。
    -m 以兆字節(jié)(MB)為計算單位。
    -h 是輸出的信息更易于閱讀。
    -s 只顯示工作目錄所占總空間。
    --exclude=PATTERN 排除掉符合樣式的文件,Pattern就是普通的Shell樣式,?表示任何一個字符,*表示任意多個字符。
    --max-depth=N 從當前目錄算起,目錄深度大于N的子目錄將不被計算,該選項不能和s選項同時存在。

        #僅顯示子一級目錄的信息。
        /> du --max-depth=1 -h
        246M    ./stephen
        246M    .   
        /> du -sh ./*   #獲取當前目錄下所有子目錄所占用的磁盤空間大小。
        352K    ./MemcachedTest
        132K    ./Test
        33M     ./thirdparty   
        #在當前目錄下,排除目錄名模式為Te*的子目錄(./Test),輸出其他子目錄占用的磁盤空間大小。
        /> du --exclude=Te* -sh ./*  
        352K    ./MemcachedTest
        33M     ./thirdparty



    http://www.cnblogs.com/stephen-liu74/archive/2011/12/05/2257887.html

    posted @ 2013-03-05 12:12 abin 閱讀(692) | 評論 (0)編輯 收藏

    因為在日常的工作中,出問題的時候查看日志是每個管理員的習慣,作為初學者,為了以后的需要,我今天將下面這些查看命令共享給各位

    cat

    tail -f

    日 志 文 件 說 明

    /var/log/message 系統(tǒng)啟動后的信息和錯誤日志,是Red Hat Linux中最常用的日志之一

    /var/log/secure 與安全相關的日志信息

    /var/log/maillog 與郵件相關的日志信息

    /var/log/cron 與定時任務相關的日志信息

    /var/log/spooler 與UUCP和news設備相關的日志信息

    /var/log/boot.log 守護進程啟動和停止相關的日志消息

    系統(tǒng):

    # uname -a # 查看內(nèi)核/操作系統(tǒng)/CPU信息

    # cat /etc/issue

    # cat /etc/redhat-release # 查看操作系統(tǒng)版本

    # cat /proc/cpuinfo # 查看CPU信息

    # hostname # 查看計算機名

    # lspci -tv # 列出所有PCI設備

    # lsusb -tv # 列出所有USB設備

    # lsmod # 列出加載的內(nèi)核模塊

    # env # 查看環(huán)境變量

    資源:

    # free -m # 查看內(nèi)存使用量和交換區(qū)使用量

    # df -h # 查看各分區(qū)使用情況

    # du -sh <目錄名> # 查看指定目錄的大小

    # grep MemTotal /proc/meminfo # 查看內(nèi)存總量

    # grep MemFree /proc/meminfo # 查看空閑內(nèi)存量

    # uptime # 查看系統(tǒng)運行時間、用戶數(shù)、負載

    # cat /proc/loadavg # 查看系統(tǒng)負載

    磁盤和分區(qū):

    # mount | column -t # 查看掛接的分區(qū)狀態(tài)

    # fdisk -l # 查看所有分區(qū)

    # swapon -s # 查看所有交換分區(qū)

    # hdparm -i /dev/hda # 查看磁盤參數(shù)(僅適用于IDE設備)

    # dmesg | grep IDE # 查看啟動時IDE設備檢測狀況

    網(wǎng)絡:

    # ifconfig # 查看所有網(wǎng)絡接口的屬性

    # iptables -L # 查看防火墻設置

    # route -n # 查看路由表

    # netstat -lntp # 查看所有監(jiān)聽端口

    # netstat -antp # 查看所有已經(jīng)建立的連接

    # netstat -s # 查看網(wǎng)絡統(tǒng)計信息

    進程:

    # ps -ef # 查看所有進程

    # top # 實時顯示進程狀態(tài)(另一篇文章里面有詳細的介紹)

    用戶:

    # w # 查看活動用戶

    # id <用戶名> # 查看指定用戶信息

    # last # 查看用戶登錄日志

    # cut -d: -f1 /etc/passwd # 查看系統(tǒng)所有用戶

    # cut -d: -f1 /etc/group # 查看系統(tǒng)所有組

    # crontab -l # 查看當前用戶的計劃任務

    服務:

    # chkconfig –list # 列出所有系統(tǒng)服務

    # chkconfig –list | grep on # 列出所有啟動的系統(tǒng)服務

    程序:

    # rpm -qa # 查看所有安裝的軟件包

    posted @ 2013-02-11 13:40 abin 閱讀(865) | 評論 (0)編輯 收藏

    pl/sql中設置:

    tools->preferences->sql window->AutoSelect statement

    然后光標放在一行,按F8就可以了, 注意: 每個語句結尾還要分號標注一下!

    posted @ 2013-01-29 11:28 abin 閱讀(2559) | 評論 (0)編輯 收藏

    MSM--Memcached_Session_Manager介紹及使用
    http://www.iteye.com/topic/1125301
    posted @ 2013-01-27 22:42 abin 閱讀(519) | 評論 (0)編輯 收藏

    http://blog.csdn.net/small_love/article/details/6600391
    http://nassir.iteye.com/blog/1628626
    http://www.itivy.com/java/archive/2012/3/13/634672668187652766.html

    simple-spring-memcached簡介
    http://blog.csdn.net/javaman_chen/article/details/7682290

    http://blog.csdn.net/a9529lty/article/details/8529421




    posted @ 2013-01-21 22:01 abin 閱讀(930) | 評論 (0)編輯 收藏

    僅列出標題
    共50頁: First 上一頁 15 16 17 18 19 20 21 22 23 下一頁 Last 
    主站蜘蛛池模板: 男女超爽刺激视频免费播放 | 91精品成人免费国产| 日韩成全视频观看免费观看高清 | 国产AV无码专区亚洲精品| 国产福利电影一区二区三区,免费久久久久久久精 | 亚洲一区中文字幕在线电影网| 日韩精品无码一区二区三区免费| 好看的电影网站亚洲一区| 免费在线观影网站| 亚洲成a人片在线观看日本| 99在线免费观看视频| 亚洲色图.com| 成人免费a级毛片无码网站入口 | 成人嫩草影院免费观看| 国产亚洲精品AA片在线观看不加载 | 亚洲成a人片在线播放| a级毛片免费网站| 亚洲成在人线av| 国产成人免费午夜在线观看| 亚洲人成电影在线观看网| 色妞WWW精品免费视频 | 9久久免费国产精品特黄| 亚洲AV无码不卡在线播放| 精品熟女少妇a∨免费久久| 亚洲国产高清在线精品一区| 毛片免费观看视频| 黄色网址在线免费观看| 亚洲欧洲∨国产一区二区三区| 国产午夜精品久久久久免费视| 亚洲国产精品午夜电影| 免费观看亚洲人成网站| 国产一区二区三区免费| 久久精品国产亚洲αv忘忧草| 国产91久久久久久久免费| 中文字幕免费在线看线人动作大片| 亚洲另类激情综合偷自拍| 成人免费视频软件网站| 成人无码a级毛片免费| 亚洲AV日韩综合一区尤物| 狠狠亚洲狠狠欧洲2019| 国产91免费在线观看|