我们一直在对 Java Web 应用程序进行负载测试,并观察到 50 个用户的 CPU 使用率很高(这似乎不切实际)。CPU 飙升至 80% 以上。在使用 Java 飞行记录 (JFR) 对其进行分析时,我们发现上下文切换率为每秒 8400 次(如 Java 任务控制上的“热线程”选项卡所示)。分析 jfr 中的热门线程,CPU 使用率似乎分布在应用程序线程中,每个线程使用的 cpu 不到 3%。
将用户负载增加到 100、150 或 200 个用户,我们看到 CPU 飙升至 90% 以上,吞吐量(每秒事务数)保持恒定(如 50 个用户负载所示),而响应时间跨越可接受的阈值(3 秒) )。将用户负载减少到 20 个用户后,CPU 使用率平均高于 55%。应用程序线程正在耗尽 CPU 的说法当然是不正确的,因为我们的应用程序不是 CPU 密集型应用程序。代码选项卡组下的热包选项卡通过显示应用程序花费的大部分时间都在执行数据库查询来确认这一点。
我们使用 glassfish 3.1.2.2 作为我们的应用程序服务器,其中最大线程池配置为 100。Oracle Linux Server 版本 6.4 是我们的操作系统,Linux 内核版本为 2.6.39-400.214.4.el6uek.x86_64。我尝试执行 Linux 命令,即“watch -n0.5 pidstat -w -I -p ”和“watch -n.5 grep ctxt /proc//status”来查看操作系统级别的自愿和非自愿线程上下文切换,但它们没有不给出任何结果。
怀疑高上下文切换可能导致 cpu 飙升,您是否有关于可以采取哪些措施来确认线程上下文切换是高 cpu 的原因的指南,以及有哪些方法可以调整 jvm 或应用程序(如果是这样)原因?
谢谢!
我试图通过jmeter(版本2.13,java版本 - 1.8u31)记录https 网站,并在连接到https站点时收到SSLHandshakeException.错误消息是
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2011)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1113)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1363)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1391)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1375)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:436)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294)
at org.apache.jmeter.protocol.http.sampler.MeasuringConnectionManager$MeasuredConnection.open(MeasuringConnectionManager.java:107)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:643)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:479)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.executeRequest(HTTPHC4Impl.java:517)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:331)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:74)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1146)
at org.apache.jmeter.protocol.http.proxy.Proxy.run(Proxy.java:240)
Run Code Online (Sandbox Code Playgroud)
我打开了SSL的调试日志记录,但我无法理解根本原因.看来,Java客户端发送客户问候,但没有收到的服务器问候消息(其中服务器选择SSL的最高版本,最好的加密套件,无论是客户端和服务器支持,并将该信息发送给客户端).我发现客户端发送,读取和接收的协议版本之间存在差异(TLSv1.1与TLSv1.2)
这是根本原因吗?如果是这样,我该如何解决?
日志粘贴在这里 - Java SSLHandshakeException日志 - Pastebin.com
更新
正如@Anand Bhatt建议的那样,我用ssllabs分析了网站并理解了以下内容
听起来不错吗?如果是这样,我们如何让java 8客户端支持服务器支持的密码套件?
我正在使用 RestSharp 进行 GET api 调用。api 调用通过传递授权标头通过 HTTP 基本身份验证进行身份验证。
服务器使用状态代码 307 重定向 api 调用。我的客户端代码确实处理重定向,但授权标头未传递到此重定向的 api 调用。这样做是出于此处提到的正当理由。因此我确实收到了未经授权的错误。
如何配置 RestClient 来恢复授权标头?
var client = new RestClient("https://serverurl.com");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Basic Z3JvdXAxOlByb2otMzI1");
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Tenant-Id", "4892");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Run Code Online (Sandbox Code Playgroud) 在基于Java的Web应用程序中尝试将Spring Boot升级到最新版本2.1.1和Spring Framework到5.1.3时,出现以下错误
Invalid bean definition with name 'org.springframework.transaction.config.internalTransactionalEventListenerFactory' defined in null
Run Code Online (Sandbox Code Playgroud)
完整的堆栈跟踪如下。关于进一步故障排除的任何想法都将有所帮助
Failure starting application: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'org.springframework.transaction.config.internalTransactionalEventListenerFactory' defined in null: Cannot register bean definition [Root bean: class [org.springframework.transaction.event.TransactionalEventListenerFactory]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] for bean 'org.springframework.transaction.config.internalTransactionalEventListenerFactory': There is already [Root bean: class [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=transactionalEventListenerFactory; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class]] bound.
at org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition(DefaultListableBeanFactory.java:894)
at org.springframework.beans.factory.support.BeanDefinitionReaderUtils.registerBeanDefinition(BeanDefinitionReaderUtils.java:166)
at org.springframework.beans.factory.xml.ParserContext.registerBeanComponent(ParserContext.java:125)
at …Run Code Online (Sandbox Code Playgroud) 我正在使用 aws-lambda-java-events 库实现一个用 java 编码的 aws lambda 函数。为了进行故障排除,我现在只是尝试使用相同的请求正文进行响应
public class LambdaFunctionHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
@Override
public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent input, Context context) {
return new APIGatewayProxyResponseEvent().withBody(input.getBody());
}
}
Run Code Online (Sandbox Code Playgroud)
我已经定义了上面的 lambda 函数和 api 网关,但我得到的input.getBody是 null。lambda 函数的输出是一个空的 json 对象
{}
Run Code Online (Sandbox Code Playgroud)
我通过 AWS lambda 测试控制台对此进行了测试。执行成功,输出如上。api 网关集成请求配置为在 POST 方法上调用上述 lambda 函数。
以下是我的疑问
APIGatewayProxyRequestEvent getBody()字符串的一部分?APIGatewayProxyRequestEvent getBody()字符串变量中传递给 API Gateway POST 方法的请求正文?我需要定义映射模板吗?如果是这样,它应该是什么样子(我做了多次尝试但没有成功)我想通过POSTMAN传递给API网关POST方法的请求体是
{
"question":"Hello, how are you doing?"
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
2014-12-09 15:33:35.717:WARN:oejw.WebAppContext:Failed startup of context o.m.j.p.JettyWebAppContext{/xxxxx,file:/D:/java8workspace/xxxxx/src/main/webapp/},file:/D:/java8workspace/xxxx/src/main/webapp/
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.config.internalAutoProxyCreator': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.aop.framework.autoproxy.InfrastructureAdvisorAutoProxyCreator]: Constructor threw exception; nested exception is java.lang.NoSuchMethodError: org.springframework.core.CollectionFactory.createConcurrentMapIfPossible(I)Ljava/util/Map;
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1095)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1040)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:505)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:220)
at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:615)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:465)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:782)
at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:424)
at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:774)
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:249)
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1242)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:717)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:494)
at org.mortbay.jetty.plugin.JettyWebAppContext.doStart(JettyWebAppContext.java:298)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64)
at …Run Code Online (Sandbox Code Playgroud) 知道为什么IntelliJ中的"SVN集成"插件不支持"检查目录状态"命令?类似于Tortoise SVN客户端支持的"检查修改"命令?
我正在使用另一个应用程序中嵌入的齐柏林飞艇。齐柏林飞艇的版本是0.6.1-SNAPSHOT。定义下面的案例类我得到一个错误
case class GenRandInt(lb : Int, ub : Int)
{
val rnd = new scala.util.Random
def next() : Int = { lb + rnd.nextInt(ub) }
}
defined class GenRandInt
<console>:40: error: not found: value lb
def next() : Int = { lb + rnd.nextInt(ub) }
Run Code Online (Sandbox Code Playgroud)
该代码在IDE中成功执行。可能出什么问题了?
java ×4
api ×1
aws-lambda ×1
c# ×1
case-class ×1
hibernate ×1
jmeter ×1
linux ×1
maven ×1
restsharp ×1
scala ×1
spring ×1
spring-boot ×1
spring-mvc ×1
ssl ×1
svn ×1
tortoisesvn ×1
unauthorized ×1