我们有一个在 Tomcat 上运行的 Web 应用程序(由第三方开发)。我们从应用程序中获得了非常糟糕的性能。应用程序开发人员声称每晚重新启动 Web 服务器是行业最佳实践,以释放所有内存使用量并重新开始。
从客户的角度来看,这可以缓解他们白天网站崩溃的问题,但从系统管理员的角度来看,这是一个糟糕的解决方案。
我们在不同的服务器上为不同的客户端托管了 20 个这样的应用程序,确保每晚都重新启动的协调似乎是错误的。
我们正在尝试调查中等负载下 java 进程的内存使用情况。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12663 test 20 0 8378m 6.0g 4492 S 43 8.4 162:29.95 java
Run Code Online (Sandbox Code Playgroud)
如您所见,我们的常驻内存为 6Gb。现在有趣的部分是:这个过程是用这些参数执行的:
查看这些设置和实际内存使用情况,我们偶然发现了我们期望此进程使用的内容与它实际使用的内容之间的差异。
通常我们的内存问题是通过分析堆转储来解决的,但在这种情况下,我们的内存是在堆外的某个地方使用的。
问题:尝试找出如此高内存使用率的原因的步骤是什么?哪些工具可以帮助我们识别在该过程中使用内存的内容?
编辑 0
看起来这不是堆相关的问题,因为我们仍然有相当多的空间:
jmap -heap 12663
Run Code Online (Sandbox Code Playgroud)
结果(编辑以节省空间)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 2147483648 (2048.0MB)
NewSize = 536870912 (512.0MB)
MaxNewSize = 536870912 (512.0MB)
OldSize = 1610612736 (1536.0MB)
NewRatio = 7
SurvivorRatio = 8
PermSize = 21757952 …Run Code Online (Sandbox Code Playgroud) 我不确定 serverfault 是否适合问这个问题,但我想知道如果您必须为 Java Web 应用程序选择新的 CPU 类型,您会做出什么选择:
a) 具有 32 个内核和时钟速度 2.5 Ghz 的 CPU
或者
b) 具有 8 个内核但时钟速度为 3.8 Ghz 的 CPU
鉴于 Web 应用程序的每个传入 HTTP 请求都由一个免费的 Java 线程提供服务,选择 a) 可能是有意义的,因为您可以同时处理四倍多的 HTTP 请求。然而,另一方面,CPU b) 可以更快地完成单个 HTTP 请求的处理......
你怎么认为?
旁注:
我有一个运行 CentOS 的相对较新的 8 核机器。我想开发一个使用 TCP 的统计服务器。它非常简单,它接受一个 TCP 连接,增加一个计数器并关闭连接。问题是它至少需要每秒处理 10k 次请求。我怀疑 CPU/内存不会成为问题,但我更关心我可能需要在我的服务器上配置的人为限制(如半开连接)以允许这种卷。那么,这可能吗?我应该注意哪些设置?我的网卡不能处理吗?
是否有环境变量可以在基于 debian 的系统上设置临时目录?
我有一个使用该环境变量的 Java 小程序,并且在启动同一个小程序的两个实例时会感到困惑。
我们有一个在 linux 中运行在特定端口上的 java 服务器,它接受成千上万用户的持久连接。最近,我们的客户因超时错误而无法连接。我们怀疑流量太高,但我们的 java 日志实际上显示每秒连接的数量并不多。
我们怀疑是否有太多人同时尝试,并且它们基本上在操作系统级别被丢弃,因此java程序从来没有真正有机会接受连接?linux中是否有某种日志可以显示有人试图打一个套接字?
就像我想很多人一样,我们有一个 Windows/Active Directory 环境和许多需要 Java 的内部业务线应用程序。我们的经验是,Java 在这样的企业网络环境中表现不佳。初始安装没问题(至少现在有一个 MSI),但保持一切正常可能是一个很大的挑战。
我们遇到的具体问题包括:
对我们来说,它主要是一批登录脚本和骇人听闻的解决方法,但我很想听听其他人如何处理这些项目,以及是否还有其他需要注意的事情。
我使用 puppet 来安装当前的 JDK 和 tomcat。
package {
[ "openjdk-6-jdk", "openjdk-6-doc", "openjdk-6-jre",
"tomcat6", "tomcat6-admin", "tomcat6-common", "tomcat6-docs",
"tomcat6-user" ]:
ensure => present,
}
Run Code Online (Sandbox Code Playgroud)
现在我想补充
JAVA_HOME="/usr/lib/java"
export JAVA_HOME
Run Code Online (Sandbox Code Playgroud)
到/etc/profile,只是为了解决这个问题。我还没有在文档中找到直接的答案。有没有推荐的方法来做到这一点?
一般来说,我如何告诉 puppet 将这个文件放在那里或修改那个文件?我将 puppet 用于单个节点(在独立模式下)只是为了尝试并保留服务器设置的日志。
我正在编写一个 RHEL kickstart 脚本,在我的 %post 中,我需要安装一个 JRE。
基本上,当前的设置涉及我需要在第一次启动后手动进入并使用alternatives --config命令将新安装的 JRE 设置为默认值。有没有办法让我传递参数,alternatives这样我就不必手动选择正确的 JRE?
/var/log/secure:
su: pam_keyinit(su-l:session): Unable to change UID to 500 temporarily
su: pam_keyinit(su-l:session): Unable to change UID to 500 temporarily
su: pam_unix(su-l:session): session opened for user adtech by root(uid=0)
su: pam_unix(su-l:session): session closed for user adtech
Run Code Online (Sandbox Code Playgroud)
我猜这是由每个用户限制引起的,但与其他用户相比没有什么不同。
这是ulimit -n为了adtech:
[adtech@hmaster87 root]$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 192025
max locked memory (kbytes, -l) 64
max memory …Run Code Online (Sandbox Code Playgroud)