我正在使用 apache bench 为在 tomcat 上运行的 java 应用程序运行一些基准测试。
说我运行一个测试,如:
ab -c 10 -n 10000 http://localhost:8080/hello/world
Run Code Online (Sandbox Code Playgroud)
它会运行得很好。如果我遵循它:
ab -c 50 -n 50000 http://localhost:8080/hello/world
Run Code Online (Sandbox Code Playgroud)
再次它会运行良好,但如果我再试一次,它可能会在 3500 个完成的请求后开始变慢。
我需要帮助来尝试调试此问题的根本原因。
我跑到了上面,我有一些未使用的内存,所以内存似乎不是问题。
tomcat6 进程确实达到了 70-80 甚至 107%。
似乎重新启动 tomcat 可以解决问题,但有时需要重新启动服务器。
这是在分配了 200 个线程的默认 tomcat 安装上。
Tomcat 日志为空。
更新
因此,我将 tcp_tw_recycle/reuse 都更改为 1,并且现在运行 netstat 显示的计数非常低。
在更改 tcp_tw_recycle/reuse 之前,我注意到事情变慢并运行 netstat 并且我有 32400 个 tcp TIME_WAIT 连接。
所以现在运行基准测试的更新,使用 -k 开关,我看到了更多的吞吐量。但是,在某些时候事情又开始变慢了,但是现在重新启动 tomcat 使事情恢复正常。之前,即使我重新启动tomcat,运行ab 的响应时间也会非常非常慢。 现在更改 tcp_tw_recycle/reuse 后,重新启动 tomcat 使事情恢复正常。运行 top 显示只有大约 20% 的 cpu 的 tomcat,所以现在看来问题出在 tomcat 上,但我怎么知道是什么?
我正在 Windows 2008 平台上运行 Apache Tomcat (5.5) 的一个实例。我想我看到了一个与并发文件访问/锁定相关的问题。
当并发 HTTP 线程的数量增加到超过默认设置 (150) 时,我看到(使用站点监控工具)在提供某些静态内容(.js .gif .png 等)时“不自然”延迟的数量越来越多。我的意思是,服务器在开始发送之前需要 20 秒以上,或者需要 30 秒来提供小 (2KiB) 文件。
当 Tomcat 繁忙(服务超过 300 个线程)时,CPU 使用率平均约为 50-60%,磁盘使用率约为 10-30mbps。
是否有任何工具可以用于 Java 来确定是否是这种情况?Tomcat APR / Apache Native Library 是否有可能解决这个问题?
或者,还有什么我应该研究的吗?
网站分析工具截图:

如何设置 GNU/Linux 机器以自动更新较新版本的 Java 运行时环境 (JRE)?困难在于想要使用较新版本的 Java(目前为 Java 7)并且还需要合理地更新错误修复,尤其是安全更新,而无需过多的手动工作。
您可以依赖 O/S 发行版,但它们自然是保守的,因此仅提供旧 Java 版本的错误修复版本。RedHat 6 上没有 Java 7。
您可以从 Oracle 网站手动下载 JRE,并将您的JAVA_HOME环境变量设置为指向它。但是,当您希望更新企业中的多台机器时,这是不切实际的。
例如,是否有一种实用的方法可以在 RedHat 6 上使用 Java 7 并在 Oracle 发布错误修复时自动(或半自动)更新 Java 7 JRE?
我已将 Huge Pages 配置为与 Java 一起使用,尽管我对 /proc/meminfo 中的记帐有疑问,但它似乎运行良好。为了显示
# grep HugePages /proc/meminfo
AnonHugePages: 274432 kB
HugePages_Total: 1008
HugePages_Free: 596
HugePages_Rsvd: 594
HugePages_Surp: 0
Run Code Online (Sandbox Code Playgroud)
我的问题涉及“免费”和“Rsvd”数字 - 为什么它们加起来不等于 1008 的“总数”?它们实际上加起来是 1190。我在这里不明白什么?
我创建了一个简单的 Web 应用程序,它由一个带有 html、css、js 的目录组成。没有服务器代码。出于复杂的原因,我的管理员坚持将其转换为.war文件,以便在tomcat上轻松部署。同样,该应用程序根本不包含任何 Java 代码。我没有用 ant 或 eclipse 创建它。
我尝试创建一个存档:
jar cvf mywarfile.war *
Run Code Online (Sandbox Code Playgroud)
这确实创建了一个战争文件。但是,当我在 tomcat 上部署此战争时,它似乎不起作用。Tomcat 会自动将 war 文件解压缩到一个目录中,但它不会通过 Web 服务器变为可用。我想这与我的战争不包含目录WEB-INF和META-INF.
有没有一种简单的方法可以将静态客户端 Web 应用程序转换为可部署的战争文件?
我有一个奇怪的问题。每次我停止 Tomcat 时,SSH 都会变得很慢,几乎完全没有响应。SSH 接受任何命令需要一分钟甚至更长时间。当我终于再次启动 Tomcat 时,一切都恢复正常。
这是在非常繁忙的服务器上发生的。问题是由于应用程序升级,我需要经常停止Tomcat。升级通常需要几秒钟,但在这里需要将近 10 分钟,因此我们遇到了不必要的停机时间。
我看到的一件事是,当我停止 Tomcat 时top,会ksoftirqd/X以 100% 的 CPU显示很多进程。这可能是问题吗?
内核版本是: 2.6.18-308.11.1.el5
红帽版本是: Red Hat Enterprise Linux Server release 5.9 (Tikanga)
知道为什么会这样吗?
我刚开始使用 CentOS。
我安装Java
yum install java-1.7.0-openjdk-devel
Run Code Online (Sandbox Code Playgroud)
添加了一个用户:
$useradd supersite
Run Code Online (Sandbox Code Playgroud)
下载的tomcat:
$wget http://apache.mirror.anlx.net/tomcat/tomcat-7/v7.0.42/bin/apache-tomcat-7.0.42.zip
$unzip apache-tomcat-7.0.42.zip -d tomcat7
Run Code Online (Sandbox Code Playgroud)
创建的服务配置:
$ cd /etc/init.d
$ edit tomcat7-supersite
Run Code Online (Sandbox Code Playgroud)
我从这里复制了文件。
但是,当我尝试以 root 用户身份运行时(我看到我是 root@myip)
service tomcat7-supersite start
Run Code Online (Sandbox Code Playgroud)
我得到:
env: /etc/init.d/tomcat7-supersite: Permission denied
Run Code Online (Sandbox Code Playgroud)
为什么?
我的目标是在我的组织中建立一个 Java 部署规则集,但是当我们有一个通过 Active Directory 运行的工作 CA 时,我不想向第三方证书颁发机构支付代码签名证书。我遵循了我认为正确的程序来完成这项工作,但是当我最终运行任何 Java 小程序时,我收到以下错误:
无法验证自签名部署规则集 jar
我遵循的步骤是:
上述步骤均已正确完成 - 与无效证书链等无关。我可以在 Java 控制面板中看到根 CA 证书,当我单击控制面板中的部署规则集链接并查看其证书时,我看到了第 6 步中的证书及其父 CA,两者都有未来的到期日期和据我所知的正确信息。但是我在运行任何小程序时仍然收到验证错误
那么 - 是否根本不可能做到这一点,我们必须支付证书费用?或者我(希望)做错了什么?如果有人有任何见解,将不胜感激,谢谢!
我们有一个在 Amazon 上运行的基于 Java 的应用程序,并且已经配置了我们的 Amazon ELB 以成功连接到它们。但是,我们看到 Cookie 标志未设置为安全。
Name Value Domain Path Expires Secure
AWSELB lkajsldf test.com / Session No
Run Code Online (Sandbox Code Playgroud)
如何使 cookie 安全?
我们有一个在 Mac OS X 上运行的 Java 服务器应用程序。
有时这个应用程序变得没有响应,我们不得不使用kill -9. 然而,这个过程并没有消失;它似乎仍然是ps,其名称周围带有括号,并且 STAT 列中有一个问号:
$ ps u -p 776
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
camadmin 776 0.0 0.0 0 0 ?? ?E 5:12PM 0:00.00 (java)
Run Code Online (Sandbox Code Playgroud)
更重要的是,服务器正在使用的端口仍然是绑定的:
$ netstat -na | grep 9902
tcp4 0 0 *.9902 *.* LISTEN
Run Code Online (Sandbox Code Playgroud)
即使它不可见lsof:
$ sudo lsof -P -i tcp | grep 9902
$
Run Code Online (Sandbox Code Playgroud)
由于端口仍然绑定,我们无法重新启动服务器应用程序。没有重新启动机器,可以做些什么来释放端口并真正杀死这个进程?