成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

java性能調(diào)優(yōu)記錄(線程阻塞)

AndroidTraveler / 1647人閱讀

摘要:其中內(nèi)容如下網(wǎng)關(guān)的邏輯是讀取請(qǐng)求中的值,根據(jù)字段去內(nèi)存的路由表中匹配路由,然后轉(zhuǎn)發(fā)請(qǐng)求到對(duì)應(yīng)的微服務(wù)中去。排查測(cè)試接口本身的性能發(fā)現(xiàn)接口的可以達(dá)到。解決改寫代碼以實(shí)現(xiàn)同樣的功能之后進(jìn)行測(cè)試,發(fā)現(xiàn)從提升到了,問(wèn)題解決。

1. 問(wèn)題

spring-cloud-gateway 作為統(tǒng)一的請(qǐng)求入口,負(fù)責(zé)轉(zhuǎn)發(fā)請(qǐng)求到相應(yīng)的微服務(wù)中去。

采用的 Spring Cloud 的版本為 Finchley SR2。

測(cè)試一個(gè)接口的性能,發(fā)現(xiàn) tps 只有 1000 req/s 左右就上不去了。

[root@hystrix-dashboard wrk]# wrk -t 10 -c 200 -d 30s --latency -s post-test.lua "http://10.201.0.28:8888/api/v1/json"
Running 30s test @ http://10.201.0.28:8888/api/v1/json
  10 threads and 200 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   188.34ms  110.13ms   2.00s    78.43%
    Req/Sec   106.95     37.19   333.00     77.38%
  Latency Distribution
     50%  165.43ms
     75%  243.48ms
     90%  319.47ms
     99%  472.64ms
  30717 requests in 30.04s, 7.00MB read
  Socket errors: connect 0, read 0, write 0, timeout 75
Requests/sec:   1022.62
Transfer/sec:    238.68KB

其中 post-test.lua 內(nèi)容如下:

request = function()
    local headers = {}
    headers["Content-Type"] = "application/json"
    local body = [[{
        "biz_code": "1109000001",
        "channel": "7",
        "param": {
            "custom_id": "ABCD",
            "type": "test",
            "animals": ["cat", "dog", "lion"],
            "retcode": "0"
        }
    }]]
    return wrk.format("POST", nil, headers, body)
end

網(wǎng)關(guān)的邏輯是讀取請(qǐng)求中 body 的值,根據(jù) biz_code 字段去內(nèi)存的路由表中匹配路由,然后轉(zhuǎn)發(fā)請(qǐng)求到對(duì)應(yīng)的微服務(wù)中去。

2. 排查

測(cè)試接口本身的性能:

[root@hystrix-dashboard wrk]# wrk -t 10 -c 200 -d 30s --latency -s post-test.lua "http://10.201.0.32:8776/eeams-service/api/v1/json"
Running 30s test @ http://10.201.0.32:8776/eeams-service/api/v1/json
  10 threads and 200 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    26.72ms    8.59ms 260.23ms   89.66%
    Req/Sec   752.18    101.46     0.94k    78.67%
  Latency Distribution
     50%   23.52ms
     75%   28.02ms
     90%   35.58ms
     99%   58.25ms
  224693 requests in 30.02s, 50.83MB read
Requests/sec:   7483.88
Transfer/sec:      1.69MB

發(fā)現(xiàn)接口的 tps 可以達(dá)到 7000+。

通過(guò) spring-boot-admin 查看網(wǎng)關(guān)的 cpu、內(nèi)存等占用情況,發(fā)現(xiàn)都沒(méi)有用滿;查看線程狀況,發(fā)現(xiàn) reactor-http-nio 線程組存在阻塞情況。對(duì)于響應(yīng)式編程來(lái)說(shuō),reactor-http-nio 線程出現(xiàn)阻塞結(jié)果是災(zāi)難性的。

通過(guò) jstack 命令分析線程狀態(tài),定位阻塞的代碼(第 19 行):

"reactor-http-nio-4" #19 daemon prio=5 os_prio=0 tid=0x00007fb784d7f240 nid=0x80b waiting for monitor entry [0x00007fb71befc000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:404)
    - waiting to lock <0x000000008b0cec30> (a java.lang.Object)
    at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:93)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.springframework.util.ClassUtils.forName(ClassUtils.java:282)
    at org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.registerWellKnownModulesIfAvailable(Jackson2ObjectMapperBuilder.java:753)
    at org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.configure(Jackson2ObjectMapperBuilder.java:624)
    at org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.build(Jackson2ObjectMapperBuilder.java:608)
    at org.springframework.http.codec.json.Jackson2JsonEncoder.(Jackson2JsonEncoder.java:54)
    at org.springframework.http.codec.support.AbstractCodecConfigurer$AbstractDefaultCodecs.getJackson2JsonEncoder(AbstractCodecConfigurer.java:177)
    at org.springframework.http.codec.support.DefaultServerCodecConfigurer$ServerDefaultCodecsImpl.getSseEncoder(DefaultServerCodecConfigurer.java:99)
    at org.springframework.http.codec.support.DefaultServerCodecConfigurer$ServerDefaultCodecsImpl.getObjectWriters(DefaultServerCodecConfigurer.java:90)
    at org.springframework.http.codec.support.AbstractCodecConfigurer.getWriters(AbstractCodecConfigurer.java:121)
    at org.springframework.http.codec.support.DefaultServerCodecConfigurer.getWriters(DefaultServerCodecConfigurer.java:39)
    at org.springframework.web.reactive.function.server.DefaultHandlerStrategiesBuilder.build(DefaultHandlerStrategiesBuilder.java:103)
    at org.springframework.web.reactive.function.server.HandlerStrategies.withDefaults(HandlerStrategies.java:90)
    at org.springframework.cloud.gateway.support.DefaultServerRequest.(DefaultServerRequest.java:81)
    at com.glsc.imf.dbg.route.RouteForJsonFilter.filter(RouteForJsonFilter.java:34)
    at org.springframework.cloud.gateway.handler.FilteringWebHandler$DefaultGatewayFilterChain.lambda$filter$0(FilteringWebHandler.java:115)
    at org.springframework.cloud.gateway.handler.FilteringWebHandler$DefaultGatewayFilterChain$$Lambda$800/1871561393.get(Unknown Source)
    at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:44)

最終定位到問(wèn)題代碼為:

DefaultServerRequest req = new DefaultServerRequest(exchange);    // 這行代碼存在性能問(wèn)題
return req.bodyToMono(JSONObject.class).flatMap(body -> {
    ...
});

這里的邏輯是我需要讀取請(qǐng)求中 body 的值,并轉(zhuǎn)化為 json,之后根據(jù)其中的特定字段去匹配路由,然后進(jìn)行轉(zhuǎn)發(fā)。這里選擇了先把 exchange 轉(zhuǎn)化為 DefaultServerRequest,目的是為了使用該類的 bodyToMono 方法,可以方便的進(jìn)行轉(zhuǎn)換。

3. 解決

改寫代碼以實(shí)現(xiàn)同樣的功能:

return exchange.getRequest().getBody().collectList()
        .map(dataBuffers -> {
            ByteBuf byteBuf = Unpooled.buffer();
            dataBuffers.forEach(buffer -> {
                try {
                    byteBuf.writeBytes(IOUtils.toByteArray(buffer.asInputStream()));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
            return JSON.parseObject(new String(byteBuf.array()));
        })
    .flatMap(body -> {
        ...
    });

之后進(jìn)行測(cè)試,

[root@hystrix-dashboard wrk]# wrk -t 10 -c 200 -d 30s --latency -s post-test.lua "http://10.201.0.28:8888/api/v1/json"
Running 30s test @ http://10.201.0.28:8888/api/v1/json
  10 threads and 200 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    48.47ms   45.85ms 325.87ms   88.55%
    Req/Sec   548.13    202.55   760.00     80.01%
  Latency Distribution
     50%   31.18ms
     75%   39.44ms
     90%  112.18ms
     99%  227.19ms
  157593 requests in 30.02s, 35.94MB read
Requests/sec:   5249.27
Transfer/sec:      1.20MB

發(fā)現(xiàn) tps 從 1000 提升到了 5000+,問(wèn)題解決。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/73052.html

相關(guān)文章

  • 一次logback多線程調(diào)優(yōu)的經(jīng)歷

    摘要:由于不是線程安全的,故在方法上增加了同步操作,造成競(jìng)爭(zhēng)等待。至此,整個(gè)多線程調(diào)優(yōu)結(jié)束,通過(guò)充分優(yōu)化同步競(jìng)爭(zhēng)的方式,最終使得分線程記錄日志的性能比最原始的多線程寫同一文件提高了倍去鎖提高到倍,替換提高倍 背景 ??在一次項(xiàng)目的性能調(diào)優(yōu)中,發(fā)現(xiàn)出現(xiàn)競(jìng)爭(zhēng)瓶頸,導(dǎo)致在資源未使用滿的情況下,TPS已經(jīng)無(wú)法提升。祭起JMC(JAVA MISSON CONTROL)飛行記錄器大法后,發(fā)現(xiàn)線程集中等待...

    khs1994 評(píng)論0 收藏0
  • 【nginx網(wǎng)站性能優(yōu)化篇(4)】理解nginx的高并發(fā)原理及其配置調(diào)優(yōu)

    摘要:使用了多路復(fù)用技術(shù)的,就成了并發(fā)事件驅(qū)動(dòng)的服務(wù)器。進(jìn)程主要負(fù)責(zé)收集分發(fā)請(qǐng)求。同時(shí)進(jìn)程也負(fù)責(zé)監(jiān)控的狀態(tài),保證高可靠性進(jìn)程一般設(shè)置為跟核心數(shù)一致。所以才使得支持更高的并發(fā)。配置調(diào)優(yōu)調(diào)整指要生成的數(shù)量最佳實(shí)踐是每個(gè)運(yùn)行個(gè)工作進(jìn)程。 Nginx 是如何實(shí)現(xiàn)高并發(fā)的? Nginx 采用的是多進(jìn)程(單線程) & 多路IO復(fù)用模型。使用了 I/O 多路復(fù)用技術(shù)的 Nginx,就成了并發(fā)事件驅(qū)動(dòng)的服務(wù)...

    CODING 評(píng)論0 收藏0
  • Java 性能調(diào)優(yōu)指南之 Java 集合概覽

    摘要:?jiǎn)尉€程集合本部分將重點(diǎn)介紹非線程安全集合。非線程安全集合框架的最新成員是自起推出的。這是標(biāo)準(zhǔn)的單線程陣營(yíng)中唯一的有序集合。該功能能有效防止運(yùn)行時(shí)造型。檢查個(gè)集合之間不存在共同的元素?;谧匀慌判蚧蛘页黾现械淖畲蠡蜃钚≡?。 【編者按】本文作者為擁有十年金融軟件開(kāi)發(fā)經(jīng)驗(yàn)的 Mikhail Vorontsov,文章主要概覽了所有標(biāo)準(zhǔn) Java 集合類型。文章系國(guó)內(nèi) ITOM 管理平臺(tái) O...

    gnehc 評(píng)論0 收藏0
  • jvm調(diào)優(yōu)

    摘要:垃圾回收垃圾檢測(cè)引用計(jì)數(shù)法和可達(dá)性分析算法。引用計(jì)數(shù)法給一個(gè)對(duì)象添加引用計(jì)數(shù)器,每當(dāng)有個(gè)地方引用它,計(jì)數(shù)器就加,引用失效就減。通常會(huì)在老年代內(nèi)存被占滿時(shí)將會(huì)觸發(fā),回收整個(gè)堆內(nèi)存。 基礎(chǔ)知識(shí) JVM - HotSpot內(nèi)存布局(1.8之前版本) showImg(https://segmentfault.com/img/bVMdE6?w=1024&h=608); 1.8版本開(kāi)始,持久區(qū)沒(méi)有...

    jemygraw 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

AndroidTraveler

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<