少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

          #

          java處理高并發高負載類網站中數據庫的設計方法(java教程,java處理大量數據,java高負載數據)

          一:高并發高負載類網站關注點之數據庫

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

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

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

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

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

          HTTP請求---Web服務器---Servlet--業務邏輯處理--訪問數據--填充JSP--響應請求

          HTML靜態化之后:

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

          靜態訪求如下

          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;}//如果有這個文件就告訴瀏覽器轉向  
                  INovelChapterBiz novelChapterBiz = new NovelChapterBizImpl(); 
                  NovelChapter novelChapter = novelChapterBiz.searchNovelChapterById(Integer.parseInt(request.getParameter("chapterId")));//章節信息  
                  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靜態頁面的類:

          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; 
          /**
           * 創建HTML靜態頁面
           * 功能:創建HTML靜態頁面
           * 時間:2009年1011日
           * 地點:home
           * @author mavk
           *
           */ 
          public class CreateStaticHTMLPage { 
              /**
               * 生成靜態HTML頁面的方法
               * @param request 請求對象
               * @param response 響應對象
               * @param servletContext Servlet上下文
               * @param fileName 文件名稱
               * @param fileFullPath 文件完整路徑
               * @param jspPath 需要生成靜態文件的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));//把轉換字節流轉換成字符流  
                  HttpServletResponse httpServletResponse = new HttpServletResponseWrapper(response){//用于從response獲取結果流資源(重寫了兩個方法)  
                      public ServletOutputStream getOutputStream(){ 
                          return servletOuputStream; 
                      } 
                      public PrintWriter getWriter(){ 
                          return printWriter; 
                      } 
                  }; 
                  rd.include(request, httpServletResponse);//發送結果流  
                  printWriter.flush();//刷新緩沖區,把緩沖區的數據輸出  
                  FileOutputStream fileOutputStream = new FileOutputStream(fileFullPath); 
                  byteArrayOutputStream.writeTo(fileOutputStream);//把byteArrayOuputStream中的資源全部寫入到fileOuputStream中  
                  fileOutputStream.close();//關閉輸出流,并釋放相關資源  
                  response.sendRedirect(fileName);//發送指定文件流到客戶端  
              } 
          }
           

          三:高并發高負載類網站關注點之緩存、負載均衡、存儲

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


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

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

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


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

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


          利用Apache實現圖片服務器的分離
          緣由:
          起步階段的應用,都可能部署在一臺服務器上(費用上的原因)
          第一個優先分離的,肯定是數據庫和應用服務器。
          第二個分離的,會是什么呢?各有各的考慮,我所在的項目組重點考慮的節約帶寬,服務器性能再好,帶寬再高,并發來了,也容易撐不住。因此,我這篇文章的重點在這里。這里重點是介紹實踐,不一定符合所有情況,供看者參考吧,
          環境介紹:
          WEB應用服務器:4CPU雙核2G, 內存4G
            部署:Win2003/Apache Http Server 2.1/Tomcat6
          數據庫服務器:4CPU雙核2G, 內存4G
            部署:Win2003/MSSQL2000
          步驟:
          步驟一:增加2臺配置為:2CPU雙核2G,內存2G普通服務器,做資源服務器
            部署:Tomcat6,跑了一個圖片上傳的簡單應用,(記得指定web.xml的<distributable/>),并指定域名為res1.***.com,res2.***.com,采用ajp協議
          步驟二:修改Apache httpd.conf配置
            原來應用的文件上傳功能網址為:
             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> 
          步驟三,修改業務邏輯:
            所有上傳文件在數據庫中均采用全url的方式保存,例如產品圖片路徑存成:http://res1.***.com/upload/20090101/product120302005.jpg

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

          五:高并發高負載網站的系統架構之數據庫集群和庫表散列

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


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

          六:高并發高負載網站的系統架構之緩存

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

           

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





          http://www.ablanxue.com/prone_1020_1.html
          posted @ 2013-03-21 15:53 abin 閱讀(1999) | 評論 (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里面添加的內容

          <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("接收到銀聯的異步通知");
            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里面添加的內容

          <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("接收到銀聯的異步通知");
            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中卻查不到剛剛插入的記錄,最后發現這個Procedure的定義中加入了PRAGMA AUTONOMOUS_TRANSACTION

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



          自治事務的特點

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

          第二,在自治事務中,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  




          轉載請注明出處:http://blog.csdn.net/pan_tian/article/details/7675800




          posted @ 2013-03-08 16:29 abin 閱讀(483) | 評論 (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 閱讀(3807) | 評論 (0)編輯 收藏

          十八.  和系統運行狀況相關的Shell命令:

              1.  Linux的實時監測命令(watch):
              watch 是一個非常實用的命令,可以幫你實時監測一個命令的運行結果,省得一遍又一遍的手動運行。該命令最為常用的兩個選項是-d和-n,其中-n表示間隔多少秒執行一次"command",-d表示高亮發生變化的位置。下面列舉幾個在watch中常用的實時監視命令:
              /> watch -d -n 1 'who'   #每隔一秒執行一次who命令,以監視服務器當前用戶登錄的狀況
              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可以退出正在執行的watch監控進程。
             
              #watch可以同時運行多個命令,命令間用分號分隔。
              #以下命令監控磁盤的使用狀況,以及當前目錄下文件的變化狀況,包括文件的新增、刪除和文件修改日期的更新等。
              /> 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監視的目錄下,如/home/stephen/test,執行下面的命令
              /> touch aa         #在執行該命令之后,另一個執行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命令執行之后watch輸出的高亮變化部分。

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

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

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

          列名 說明
          total 總計物理內存的大小。
          used 已使用的內存數量。
          free 可用的內存數量。
          Shared 多個進程共享的內存總額。
          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命令的輸出,我們只需關注紅色高亮的輸出行和綠色高亮的輸出行,見如下具體解釋:
              紅色輸出行:該行使從操作系統的角度來看待輸出數據的,used(671776)表示內核(Kernel)+Applications+buffers+cached。free(359544)表示系統還有多少內存可供使用。
              綠色輸出行:該行則是從應用程序的角度來看輸出數據的。其free = 操作系統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  #以千字節(KB)為單位顯示數據,同時每隔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的實時監控工具(mpstat)
              該命令主要用于報告當前系統中所有CPU的實時運行狀況。
              #該命令將每隔2秒輸出一次CPU的當前運行狀況信息,一共輸出5次,如果沒有第二個數字參數,mpstat將每隔兩秒執行一次,直到按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

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

          列名 說明
          %user 在internal時間段里,用戶態的CPU時間(%),不包含nice值為負進程  (usr/total)*100
          %nice 在internal時間段里,nice值為負進程的CPU時間(%)   (nice/total)*100
          %sys 在internal時間段里,內核時間(%)       (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時間前的值。上表中的所有值可取到兩位小數點。    

              /> mpstat -P ALL 2 3  #-P ALL表示打印所有CPU的數據,這里也可以打印指定編號的CPU數據,如-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.  虛擬內存的實時監控工具(vmstat)
              vmstat命令用來獲得UNIX系統有關進程、虛存、頁面交換空間及CPU活動的信息。這些信息反映了系統的負載情況。vmstat首次運行時顯示自系統啟動開始的各項統計信息,之后運行vmstat將顯示自上次運行該命令以后的統計信息。用戶可以通過指定統計的次數和時間來獲得所需的統計信息。
              /> 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:  在就緒狀態等待的進程數。
              b: 在等待狀態等待的進程數。   
              有關內存的信息有:(memory)
              swpd:  正在使用的swap大小,單位為KB。
              free:    空閑的內存空間。
              buff:    已使用的buff大小,對塊設備的讀寫進行緩沖。
              cache: 已使用的cache大小,文件系統的cache。
              有關頁面交換空間的信息有:(swap)
              si:  交換內存使用,由磁盤調入內存。
              so: 交換內存使用,由內存調入磁盤。 
              有關IO塊設備的信息有:(io)
              bi:  從塊設備讀入的數據總量(讀磁盤) (KB/s)
              bo: 寫入到塊設備的數據總理(寫磁盤) (KB/s)  
              有關故障的信息有:(system)
              in: 在指定時間內的每秒中斷次數。
              sy: 在指定時間內每秒系統調用次數。
              cs: 在指定時間內每秒上下文切換的次數。  
              有關CPU的信息有:(cpu)
              us:  在指定時間間隔內CPU在用戶態的利用率。
              sy:  在指定時間間隔內CPU在核心態的利用率。
              id:  在指定時間間隔內CPU空閑時間比。
              wa: 在指定時間間隔內CPU因為等待I/O而空閑的時間比。  
              vmstat 可以用來確定一個系統的工作是受限于CPU還是受限于內存:如果CPU的sy和us值相加的百分比接近100%,或者運行隊列(r)中等待的進程數總是不等于0,且經常大于4,同時id也經常小于40,則該系統受限于CPU;如果bi、bo的值總是不等于0,則該系統受限于內存。

              5.  設備IO負載的實時監控工具(iostat)
              iostat主要用于監控系統設備的IO負載情況,iostat首次運行時顯示自系統啟動開始的各項統計信息,之后運行iostat將顯示自上次運行該命令以后的統計信息。用戶可以通過指定統計的次數和時間來獲得所需的統計信息。
              其中該命令中最為常用的使用方式如下:
              /> 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 每秒塊(扇區)讀取的數量。
          Blk_wrtn/s 每秒塊(扇區)寫入的數量。
          Blk_read 總共塊(扇區)讀取的數量。
          Blk_wrtn 總共塊(扇區)寫入的數量。

              iostat還有一個比較常用的選項-x,該選項將用于顯示和io相關的擴展數據。
              /> 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
              還可以在命令行參數中指定要監控的設備名,如:
              /> iostat -dx sda 1 3   #指定監控的設備名稱為sda,該命令的輸出結果和上面命令完全相同。

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

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

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

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

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

              #監控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:      該進程在用戶態的CPU使用率。
              %system:該進程在內核態(系統級)的CPU使用率。
              %CPU:     該進程的總CPU使用率,如果在SMP環境下,該值將除以CPU的數量,以表示每CPU的數據。
              CPU:         該進程所依附的CPU編號(0表示第一個CPU)。

              #監控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:   該進程每秒的字節讀取數量(KB)。
              kB_wr/s:   該進程每秒的字節寫出數量(KB)。
              kB_ccwr/s: 該進程每秒取消磁盤寫入的數量(KB)。

              #監控pid為1(init)的進程的內存使用情況,其中每隔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:  該進程的內存使用百分比。

              #監控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:    每秒任務主動(自愿的)切換上下文的次數。主動切換是指當某一任務處于阻塞等待時,將主動讓出自己的CPU資源。
              nvcswch/s: 每秒任務被動(不自愿的)切換上下文的次數。被動切換是指CPU分配給某一任務的時間片已經用完,因此將強迫該進程讓出CPU的執行權。

              #監控pid為1(init)的進程及其內部線程的內存(r選項)使用情況,其中每隔2秒刷新并輸出一次,3次后程序退出。需要說明的是,如果-t選項后面不加任何其他選項,缺省監控的為CPU資源。結果中黃色高亮的部分表示進程和其內部線程是樹狀結構的顯示方式。
              /> 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。  

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

              7.  報告磁盤空間使用狀況(df):
              該命令最為常用的選項就是-h,該選項將智能的輸出數據單位,以便使輸出的結果更具可讀性。
              /> 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 以字節為計算單位。
          -k 以千字節(KB)為計算單位。
          -m 以兆字節(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 閱讀(688) | 評論 (0)編輯 收藏

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

          cat

          tail -f

          日 志 文 件 說 明

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

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

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

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

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

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

          系統:

          # uname -a # 查看內核/操作系統/CPU信息

          # cat /etc/issue

          # cat /etc/redhat-release # 查看操作系統版本

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

          # hostname # 查看計算機名

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

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

          # lsmod # 列出加載的內核模塊

          # env # 查看環境變量

          資源:

          # free -m # 查看內存使用量和交換區使用量

          # df -h # 查看各分區使用情況

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

          # grep MemTotal /proc/meminfo # 查看內存總量

          # grep MemFree /proc/meminfo # 查看空閑內存量

          # uptime # 查看系統運行時間、用戶數、負載

          # cat /proc/loadavg # 查看系統負載

          磁盤和分區:

          # mount | column -t # 查看掛接的分區狀態

          # fdisk -l # 查看所有分區

          # swapon -s # 查看所有交換分區

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

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

          網絡:

          # ifconfig # 查看所有網絡接口的屬性

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

          # route -n # 查看路由表

          # netstat -lntp # 查看所有監聽端口

          # netstat -antp # 查看所有已經建立的連接

          # netstat -s # 查看網絡統計信息

          進程:

          # ps -ef # 查看所有進程

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

          用戶:

          # w # 查看活動用戶

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

          # last # 查看用戶登錄日志

          # cut -d: -f1 /etc/passwd # 查看系統所有用戶

          # cut -d: -f1 /etc/group # 查看系統所有組

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

          服務:

          # chkconfig –list # 列出所有系統服務

          # chkconfig –list | grep on # 列出所有啟動的系統服務

          程序:

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

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

          pl/sql中設置:

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

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

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

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

          僅列出標題
          共50頁: First 上一頁 15 16 17 18 19 20 21 22 23 下一頁 Last 
          主站蜘蛛池模板: 农安县| 措勤县| 衡阳市| 祁连县| 宾川县| 高雄市| 盐津县| 繁峙县| 永兴县| 昔阳县| 高青县| 永定县| 漳州市| 泗洪县| 永春县| 海门市| 浦东新区| 建阳市| 句容市| 黄大仙区| 西藏| 永仁县| 竹山县| 淮安市| 石泉县| 肇州县| 酒泉市| 固始县| 海晏县| 绍兴县| 灵武市| 广水市| 乳源| 长葛市| 新晃| 乾安县| 蒙城县| 中方县| 雅江县| 武功县| 正宁县|