合理设置servicecomb.rest.server.thread-count的值

ServiceComb SDK默认的servicecomb.rest.server.thread-count为1可能导致CPU利用率低,实际含义是垂直实例数量。该配置与操作系统资源绑定,大于CPU核数无意义。 Vertx使用少量线程池处理高并发,而增加servicecomb.rest.client.thread-count可分配更多连接资源。举例说明,CPU数为2时,不同thread-count配置如何影响eventloop和垂直实例。

很对开发者测试的时候,发现CSE SDK的CPU占用率很多时候只能够到1CPU,这是因为servicecomb.rest.server.thread-count默认值为1。 官网文档将这个配置项含义解释为“服务端线程数”(参考: https://docs.servicecomb.io/java-chassis/zh_CN/build-provider/protocol/rest-over-vertx.html),这个解释其实不怎么准确,容易和event-loop线程数混淆,开发者理解不了,而且提升这个值,CPU的利用率确实会增加,但是通过jstack查看线程数,却不会增加。 

servicecomb.rest.server.thread-count实际上的含义是Vertical的一个概念: vertical instances count。 他是一个非常抽象的概念, 涉及到资源分配和线程绑定关系。比如当值为1的时候,服务端每收到一个请求,就会将请求丢到一个event-loop线程去执行,然后这个绑定关系就确定下来了,不会发生改变。 

单纯的从服务端来看,缺省值为1,而event-loop线程是2 * CPU个,无法修改,那么实际上被使用的event-loop线程只有1个,其他线程都是永远空缺着的。 vertical instances count和操作系统资源是紧密绑定的,对于服务端而言,CPU核数就是资源,因此servicecomb.rest.server.thread-count大于CPU核数就显得毫无意义了。

但是操作系统还有其他的资源和处理,一个进程里面还会处理客户端网络调用, servicecomb.rest.client.thread-count增加,会分配更多的连接资源(句柄)。客户端的一个vertical instance和服务端一样,绑定到一个event-loop线程执行,不会改变。 

Vertx就是利用了极小的线程池(2 * CPU),处理大量的并发请求(网络适配器、CPU、磁盘等)。着也就理解了为什么通常event-loop线程数固定不变,但是单纯看一个点,存在线程池冗余的情况。 总体来看,线程池是被合理的利用到其他地方了。 

java.io.FileNotFoundException: dropdowns.json (系统找不到指定的文件。) at java.base/java.io.FileInputStream.open0(Native Method) at java.base/java.io.FileInputStream.open(FileInputStream.java:213) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:152) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:106) at com.huawei.healthkit.utils.fileReader.readConfig(fileReader.java:20) at com.huawei.healthkit.server.dataquery.controller.DropDownController.getDropdownOptions(DropDownController.java:43) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.apache.servicecomb.core.handler.impl.ProducerOperationHandler.doInvoke(ProducerOperationHandler.java:125) at org.apache.servicecomb.core.handler.impl.ProducerOperationHandler.syncInvoke(ProducerOperationHandler.java:110) at org.apache.servicecomb.core.handler.impl.ProducerOperationHandler.invoke(ProducerOperationHandler.java:63) at org.apache.servicecomb.core.handler.impl.ProducerOperationHandler.handle(ProducerOperationHandler.java:54) at org.apache.servicecomb.core.Invocation.next(Invocation.java:288) at com.huawei.webplatform.nuwa.cse.provider.BaseProviderHandler.handle(BaseProviderHandler.java:51) at com.huawei.healthkit.cse.RestfulInterceptorHandler.handle(RestfulInterceptorHandler.java:43) at org.apache.servicecomb.core.Invocation.next(Invocation.java:288) at org.apache.servicecomb.common.rest.AbstractRestInvocation.doInvoke(AbstractRestInvocation.java:296) at org.apache.servicecomb.common.rest.AbstractRestInvocation.invoke(AbstractRestInvocation.java:267) at org.apache.servicecomb.common.rest.AbstractRestInvocation.runOnExecutor(AbstractRestInvocation.java:251) at org.apache.servicecomb.common.rest.AbstractRestInvocation.lambda$scheduleInvocation$2(AbstractRestInvocation.java:207) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583)
最新发布
10-17
`java.io.FileNotFoundException: dropdowns.json (系统找不到指定的文件。)` 错误表明程序在尝试访问 `dropdowns.json` 文件时,未能在指定的路径下找到该文件。以下是几种可能的解决办法: #### 检查文件路径 要保证文件路径准确无误,注意文件路径区分大小写。可以使用绝对路径来明确指定文件的位置,避免相对路径可能带来的问题。 ```java import java.io.FileInputStream; import java.io.FileNotFoundException; public class ReadJsonFile { public static void main(String[] args) { try { // 使用绝对路径 FileInputStream fis = new FileInputStream("C:\\your_directory\\dropdowns.json"); // 后续文件操作代码 } catch (FileNotFoundException e) { e.printStackTrace(); } } } ``` #### 检查文件是否存在 在尝试打开文件之前,先检查文件是否存在。可以使用 `File` 类的 `exists()` 方法来进行检查。 ```java import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; public class CheckFileExistence { public static void main(String[] args) { File file = new File("dropdowns.json"); if (file.exists()) { try { FileInputStream fis = new FileInputStream(file); // 后续文件操作代码 } catch (FileNotFoundException e) { e.printStackTrace(); } } else { System.out.println("文件不存在,请检查文件路径。"); } } } ``` #### 检查文件权限 确保程序有足够的权限访问该文件。如果文件被其他程序占用或者文件所在目录没有读写权限,程序可能无法访问该文件。 #### 检查文件是否在类路径下 如果文件位于类路径下,可以使用 `ClassLoader` 来加载文件。 ```java import java.io.InputStream; public class ReadJsonFromClasspath { public static void main(String[] args) { InputStream is = ReadJsonFromClasspath.class.getClassLoader().getResourceAsStream("dropdowns.json"); if (is != null) { // 后续文件操作代码 } else { System.out.println("文件不在类路径下,请检查。"); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值