我们拥有2个Node Agent和4个Application Server的WebSphere环境。在高流量时,其中一个应用程序服务器停止响应请求,跳转到最大Web容器线程数
在分析线程转储时,我们发现大约60%的线程处于可运行状态,其中20%处于Wait和Parked状态。
我们在线程转储中看不到任何死锁警告。
仔细看,我们发现其中一个Web容器线程拥有锁,并带有以下消息:
server
{
listen 80;
server_name code.example.com;
charset utf-8;
location /
{
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:3000;
}
server_tokens off;
}
有人可以帮助理解上述错误及其解决方法吗?
答案 0 :(得分:1)
查看拥有该锁的线程的堆栈跟踪非常重要,然后查看等待该锁的所有其他线程的堆栈跟踪。对于ExtJarClassLoader,它几乎肯定意味着所有线程都在尝试执行loadClass操作。如果许多线程正在尝试此操作并被阻止,那么这通常意味着正在运行的代码正在尝试失败的 loadClass操作,捕获ClassNotFoundException并继续。创建和抛出ClassNotFoundException是昂贵的,因此通常应修改代码以缓存整体结果(例如,如果它正在尝试一系列类加载,则应以某种方式缓存正/负结果)。如果调用loadClass的代码是第三方库,这当然会很复杂。