国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

如何設置tomcat線程池大小?

MartinHan / 1423人閱讀

摘要:背景在我們的日常開發中都涉及到使用做為服務器,但是我們該設置多大的線程池呢以及根據什么原則來設計這個線程池呢接下來,我將介紹本人是怎么設計以及計算的。

背景

在我們的日常開發中都涉及到使用tomcat做為服務器,但是我們該設置多大的線程池呢?以及根據什么原則來設計這個線程池呢?接下來,我將介紹本人是怎么設計以及計算的。

具體方法

眾所周知,tomcat接受一個request后處理過程中,會涉及到cpu和IO時間。其中IO等待時間,cpu被動放棄執行,其他線程就可以利用這段時間片進行操作。所以我們可以采用服務器IO優化的通用規則。
線程大小 = ( (線程io時間 + 線程cpu) / 線程cpu time) * cpu核數

舉例

線程io時間為100ms(IO操作比如數據庫查詢,同步遠程調用等),線程cpu時間10ms,服務器物理機核數為4個。通過上面的公式,我們計算出來的大小是 ((100 + 10 )/10 ) *4 = 44。理論上我們有依據,但是實際計算過程中我們怎么知道線程IO時間和cpu時間呢? 這個就涉及到實際編碼過程中的怎么樣監控處理時間啦。

通過java 實現內置的filter接口,我們可以拿到一個request消耗的總時間

public class MoniterFilter implements Filter {
  
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,  
                            FilterChain chain) throws IOException,
                             ServletException {
        long start = System.currentTimeMillis();
        String params = getQueryString(httpRequest);
        try {
            chain.doFilter(httpRequest, httpResponse);
        } finally {
            logger.info("access url [{}{}], cost time [{}] ms )", uri, 
                        params, cost);
        }
  
    private String getQueryString(HttpServletRequest req) {
        StringBuilder buffer = new StringBuilder("?");
        Enumeration emParams = req.getParameterNames();
        try {
            while (emParams.hasMoreElements()) {
                String sParam = emParams.nextElement();
                String sValues = req.getParameter(sParam);
                buffer.append(sParam).append("=").append(sValues).append("&");
            }
            return buffer.substring(0, buffer.length() - 1);
        } catch (Exception e) {
        }
        return "";
    }
}

通過添加切面來監控線程IO耗時(jdk,cglib)

public class DaoInterceptor implements MethodInterceptor {

    private static final Logger logger = LoggerFactory.getLogger(DaoInterceptor.class);

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        StopWatch watch = new StopWatch();
        watch.start();
        Object result = null;
        Throwable t = null;
        try {
            result = invocation.proceed();
        } catch (Throwable e) {
            t = e == null ? null : e.getCause();
            throw e;
        } finally {
            watch.stop();
            logger.info("({}ms)", watch.getTotalTimeMillis());

        }

        return result;
    }
}

通過上述代碼就可以計算出相應時間,從而計算出線程大小啦。但是我們就到此為止了嗎?
其實還沒有,計算出的數值只是存在理論情況下,我們還是需要通過壓測工具(Jmeter)來壓測一下線服務器,同時根據qps值來動態微調剛才計算出的線程池大小。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64536.html

相關文章

  • 幾種限流技術

    摘要:下面是幾種常見的限流技術一限流算法常用的限流算法有令牌桶,漏桶令牌桶令牌桶算法是網絡流量整形和速率限制中最常使用的一種算法。 就秒殺接口來說,當訪問頻率或者并發請求超過其承受范圍的時候,這時候我們就要考慮限流來保證接口的可用性,以防止非預期的請求對系統壓力過大而引起的系統癱瘓。通常的策略就是拒絕多余的訪問,或者讓多余的訪問排隊等待服務。下面是幾種常見的限流技術 一、限流算法常用的限流算...

    Warren 評論0 收藏0
  • Tomcat使用線程配置高并發連接

    摘要:配置重要參數說明表示使用該參數值對應的線程池服務器啟動時創建的處理請求的線程數最大可以創建的處理請求的線程數指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理。 1:配置executor屬性 打開/conf/server.xml文件,在Connector之前配置一個線程池: 重要參數說明:name:共享線程池的名字。這是Conn...

    Meathill 評論0 收藏0
  • Tomcat 7 server.xml 配置文件詳解

    摘要:每個可以創建一個線程池,但是可以在以及其他組件之間共享,只要那些組件配置之后支持。線程池最大活躍線程數量,默認。如果配置了組件防止泄露的監聽器,它會通知停止環境。如果未指定此屬性,會使用一個私有的內部來提供線程池。 概覽 Tomcat7作為Servlet/JSP容器,它的全部行為的配置指令,包含在/conf/server.xml文件中,這個文件是一個無預定義結構的XML文件,所有的屬性...

    crossoverJie 評論0 收藏0

發表評論

0條評論

MartinHan

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<