工匠智造文档

应用实例配置

应用程序主要参数

线程分配

  • 主要影响
    • 响应速度
    • 并发量
    • 数据查询量 ?
  • 受服务相关配置的影响
    • 处理器
    • 内存

内存分配

  • 主要影响
    • 大数据处理
    • 线程分配最大值
  • 受服务器相关配置的影响
    • 内存

应用程序主要配置

线程

跨服务调用线程配置

service/sc-config/config/app/app-public.yml 配置文件中配置

hystrix:
  threadpool:
    default:
      coreSize: 200        # 并发执行的最大线程数
      maxQueueSize: 500    # BlockingQueue的最大队列数
      queueSizeRejectionThreshold: 500
  command:
    default:
      execution:
        isolation:
          semaphore:
            maxConcurrentRequests: 500    # 最大并发请求数

应用程序线程池配置

service/sc-config/config/app/app-public.yml 配置文件中配置

# 线程池配置
thread-pool-config:
  core-pool-size: 16       # 核心线程数
  max-pool-size: 64        # 最大线程数
  queue-capacity: 500      # 缓冲队列数
  keep-alive-seconds: 60

MySQL 线程池配置

service/sc-config/config/app/*.yml 的应用程序对应配置文件中配置

spring:
  datasource:
    druid:
      app-base-msg:
        initial-size: 10 # 初始化连接
        min-idle: 5      # 最小空闲连接
        max-active: 600  # 最大连接数量

操作系统对线程数量的限制

  • 限制最大线程数的主要因素: 线程堆栈大小, 进程的最大内存
  • 通过 ulimit -a 命令, 可以查看操作系统默认资源限制的设定

内存

在应用程序的相关 docker-compose.yml 文件中配置

command: "java -jar -Xmx1024m -Xms1024m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m ./app.jar"

参数说明

java(JDK8) 运行命令相关参数

  • -Xmx1024m : JVM 最大的堆内存为1024m
  • -Xms1024m : JVM 启动时初始化堆内存为1024m. 此值可以设置与-Xmx相同, 以避免每次垃圾回收完成后JVM重新分配内存
  • -Xmn400m : JVM 堆内存新生代大小为400m, 增大新生代后, 将会减小老年代大小. 此值对系统性能影响较大, 官方推荐配置为整个堆的3/8
  • -Xss1m : 每个线程的堆栈大小为 1m, 默认值为 1m, 选项对性能影响比较大, 一般不需额外设置, 减小这个值能生成更多的线程. 但是操作系统对一个进程内的线程数还是有限制的, 不能无限生成, 经验值在3000~5000左右
  • -XX:MetaspaceSize=256m : 初始元数据空间大小为 256m
  • -XX:MaxMetaspaceSize=512m : 最大元数据空间大小为 512m
  • -XX:+HeapDumpOnOutOfMemoryError: 该参数可以在内存溢出时导出整个堆信息
  • -XX:HeapDumpPath=./app.dump : 设置导出堆的存放路径
  • -XX:+PrintGC : 打印 GC
  • -XX:+PrintGCDetails : 打印 GC 详情
  • -XX:+PrintGCTimeStamps : 打印 GC 的时间戳(以基准时间的形式)
  • -XX:+PrintGCDateStamps : 打印 GC 的时间戳(以日期的形式)
  • -XX:+PrintHeapAtGC : 在进行 GC 的前后打印出堆的信息
  • -Xloggc:./gc.log : 设置 GC 日志文件的路径
  • 一些参数在 JDK9 已废弃

应用实例内存分配

默认值为 "APP_JAVA_OPTS=-Xms1024m -Xmx1024m", 修改 APP_JAVA_OPTS 的值, 如果不存在则新增一行

  app-dev-md:
    image: docker.craftmake.cn/app-dev-md:latest
    environment:
      - HOST=127.0.0.1
      - SERVER_PORT=5010
      - "APP_JAVA_OPTS=-Xms4096m -Xmx4096m"
      - SW_AGENT_NAME=rlxcl::app-dev-md
      - SW_AGENT_COLLECTOR_BACKEND_SERVICES=218.77.104.104:11800
    volumes:
      - ../00-volume/config:/home/app/config
      - ./app-dev-md/logs:/home/app/logs
      - ./app-dev-md/plugins:/home/app/plugins
    ports:
      - 5010:5010
    networks:
      - gjzz_net
    restart: always

ha(公有云部署)

High Availability, 高可用, 多应用实例时部署

名称 端口 运行值 备注
entry 80
app 8010
portal 8000
service 8080, 8090
static 8020

lb(私有部署)

Load Balance, 负载均衡, 多应用实例时部署

名称 端口 运行值 备注
entry 80
app 8010
portal 8000
service 8080, 8090

web

名称 端口 运行值 备注
app 3010
portal 3000
static 3020
website 3030

ext(node)

名称 端口 运行值 备注
ext-base-cds 6050
ext-base-scm 6070
ext-dev-lcds 6060

app

名称 端口 运行值 默认最大值 64G 建议最大值 32G 建议最大值 备注
app-base-ads 5070 1024M
app-base-msg 5060 1024M
app-base-print 5050 1024M 只在公有云上部署
app-base-sop 5080 1024M
app-base-sys 5030 1024M
app-base-uc 5020 1024M 只在公有云上部署
app-dev-md 5010 1024M
app-dsf-les 5170 1024M
app-dsf-ppe 5150 1024M
app-dsf-pps 5200 1024M
app-dsf-qms 5190 1024M
app-dsf-wms 5160 1024M
app-dsf-wpm 5180 1024M
app-gateway-oauth 6110 1024M 只在私有环境上部署
app-gateway-print 6130 1024M 只在私有环境上部署
app-gateway-scm 6150 1024M 只在私有环境上部署
app-gateway-uc 6120 1024M 只在私有环境上部署
app-pub-bim 5110 1024M
app-pub-cbo 5100 1024M
app-pub-event 5120 1024M
app-sps-bug 6200 1024M
app-sps-project 6210 1024M

service

名称 端口 运行值 默认最大值 64G 建议最大值 32G 建议最大值 备注
service-base-file 2060 1024M 512M
service-base-mqtt 2070 1024M 512M
service-base-print 2130 1024M 512M
service-base-quartz 2090 1024M 512M
service-base-rabbitmq 2100 1024M 512M
service-base-redis 2110 1024M 512M
service-base-txlcn-tm 2120, 2220 1024M 512M
service-base-websocket 2080 1024M 512M
service-esb-mes 2150 1024M 512M
service-oauth-server 2160 1024M 512M 只在公有云上部署
service-sc-config 2030 1024M 512M
service-sc-esb 2000 1024M 512M
service-sc-eureka 2020 1024M 512M
service-sc-gateway 2010 1024M 512M
service-sc-zipkin 2040 1024M 512M

base

名称 端口 运行值 备注
elasticsearch 9200, 9300
kibana 5601
logstash 9600, 5044
mongo 27017
mosquitto 1883, 9001
mysql 3306
rabbitmq 5672, 15672
redis 6379
redis-cluster-01 6371, 16371
redis-cluster-02 6372, 16372
redis-cluster-03 6373, 16373
redis-cluster-04 6374, 16374
redis-cluster-05 6375, 16375
redis-cluster-06 6376, 16376

常见问题

线程较少导致的问题

  • 并发访问时出现 java.lang.IllegalStateException: No thread-bound request found
  • 数据保存事务出现 com.codingapi.txlcn.common.exception.TxManagerException: attempts to join the non-existent transaction group
  • 关联查询展开字段出现 cn.cw.common.base.util.exception.ProgramException: 展开字段【x】不存在

内存较少导致的问题

  • 处理大数据量时出现 java.lang.OutOfMemoryError

线程较多, 内存较少的问题

  • org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: unable to create new native thread

请求数据量过多且有展开字段时的问题

No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.

Tags: deploy