gpt4 book ai didi

java udp 服务器 100% cpu

转载 作者:行者123 更新时间:2023-11-30 03:04:33 25 4
gpt4 key购买 nike

我有一个 UDP 服务器,它以每秒 40 个数据包的速度接收数据包。主循环如下:

 public void serve() {
while(true) {
ByteBuffer bytes = ByteBuffer.allocate(1024);
bytes.clear();
channel.receive(bytes);
THandler th = new THandler(bytes);
th.start();
}
}

channel 初始化:

private final DatagramChannel channel ;  
channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress(port));

THandler 类扩展了一个线程类,它根据正则表达式过滤消息,然后从匹配的消息中查找 id。然后将此 ID 与订阅者列表(大约 30 万)进行比较。接下来是数据库选择,然后是更新。

public void run() {

if (!this.isValidLog()){ //does a regular expression match
return;
}
String subsId = this.getSubscriberId(); // extracts the id from message
if (this.isServiceSubscribed(subsId)) { // compares in a list of subscribers

usageDetails = this.getServiceUsage(subsId); // db Query
if(usageDetails.isFeatureAvailable()){
usageDetails.updateUsageCounter(); // db Update
}
}


}

我也尝试过使用ExecutorService。但问题是我用完了 99.6% 或更多的用户 CPU 时间。

非常欢迎任何有关如何提高服务器和代码性能的意见。

最佳答案

  • 确保 channel 处于阻止模式。
  • 您不需要清除新创建的ByteBuffer。
  • 使用具有合理大小线程池的 ExecutorService,而不是为每个数据报创建一个新线程。
  • 确保您使用的是 O(1) 数据结构。
  • 使用 UPDATE ... WHERE 将数据库查找和更新合并为一个操作,如果您需要查看是否发生了任何情况,则可以获取更新计数。
  • 忽略任何将 sleep 添加到网络代码中的建议。它们实际上是在浪费时间。

关于java udp 服务器 100% cpu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35129385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com