0%

同步方式

除了使用wait()/notify()来实现同步之外,在java.util.concurrent包中还有几种进行同步的方式,如信号量、屏障、闭锁和交换器。

阅读全文 »

性能优化

有几个与性能关系密切的属性

执行器调优

1
2
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4" maxIdleTime="60000"/>

Executor代表的是tomcat中的线程池,可以由其他组件共享使用,是Service元素的内嵌元素

  • maxThreads:指定Connector创建的请求处理线程的最大数目。该属性决定了可以并行处理的请求最大数目,即并发上限。当并发请求数超过maxThreads时,多余的请求只能排队等待,默认200
  • minSpareThreads:Tomcat允许的空闲线程的最小数目,也是启动时Connector创建的线程数目。如果空闲线程数小于该值,Tomcat将创建新的线程。默认25
  • maxIdleTime:一个线程空闲多久算是空闲线程,默认60000
  • maxQueueSize 最大等待队列,超过则拒绝
  • prestartminSpareThreads 是否启动时即生成minSpareThreads个线程,默认为true
  • namePrefix 线程名称前缀

注意配置后要在Connector节点中使用对应的executor才会生效

1
2
3
4
><Connector executor="tomcatThreadPool" port="8082" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" relaxedPathChars="|{}[],%"
relaxedQueryChars="|{}[],%"/>
阅读全文 »

日志管理器

日志管理器是kafka用来管理所有日志的,负责管理日志的创建与删除、日志检索、日志加载和恢复、检查点及日志文件刷写磁盘以及日志清理等

阅读全文 »

网络通信

kafkaServer启动时,初始化启动了一个SocketServer服务,用于接受客户端的连接、处理客户端请求、发送响应等,同时创建一个KafkaRequestHandlerPool用于管理KafkaRequestHandler。

SocketServer是基于Java NIO实现的网络通信组件,线程模型为:一个Acceptor线程负责接收客户端所有的连接;{num.network.threads}个Processor线程,每个Processor有多个Selector,负责从每个连接中读取请求;{num.io.threads}个KafkaRequestHandler线程处理请求,并将产生的请求返回给Processor线程。

KafkaRequestHandler是由KafkaRequestHandlerPool管理,在Processor和KafkaRequestHandler之间通过RequestChannel来缓冲请求,每个KafkaRequestHandler从RequestChannel.requestQueue接受RequestChannel.Request,并把Request交由KafkaApis的handle()方法处理,经处理后把对应的Response存进RequestChannel.responseQueues队列

阅读全文 »

web.xml配置文件

web.xml是web应用的部署文件,包括tomcat中conf/web.xml中的默认配置以及web应用WEB-INF/web.xml下的定制配置

阅读全文 »