我是多年的开发人员,但没有大量的操作经验,所以如果这是一个新问题,请道歉。
在我的公司,我们运行一个用 Java 编写的 Web 服务,主要基于 Tomcat Web 服务器。我们有两个数据中心,每个数据中心大约有 10 台主机。主机有几种类型:Dababase、Tomcats、一些离线java进程、memcached服务器。所有主机都是 Linux CentOS
到目前为止,在发布新版本到生产环境时,我们一直在使用一组内部 shell 脚本来复制 jars/wars 并重新启动 tomcat。
公司变得越来越大,因此操作所有这些并从开发、QA、暂存和生产中获取代码变得越来越困难。一次典型的发布多次涉及人为错误,这会花费我们宝贵的正常运行时间。有时我们需要恢复到上次已知的好处,这至少不容易说......
我们正在寻找一个工具、一个框架、一个解决方案,可以提供以下内容:
有人可以分享他们的经验吗?推荐几个工具?
谢谢!
我已经启动并运行了 Tomcat 6.0。我去调整内存大小并意识到我在 Sun JDK 1.6客户端JVM上运行它。我没有安装 Sun 服务器 JVM:
C:\>java -client -version
java version "1.6.0_16"
Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) Client VM (build 14.2-b01, mixed mode, sharing)
C:\>java -server -version
Error: no `server' JVM at `C:\appl\java\jre6u16\bin\server\jvm.dll'.
Run Code Online (Sandbox Code Playgroud)
澄清一下:我知道如何将 Tomcat 中的 JVM 从客户端切换到服务器。我只需要选择最合适的服务器 JVM。
我会注意到客户端和服务器 JVM 之间的巨大差异吗?如果我想要 Sun 服务器 JVM,我是否必须重新安装整个 JDK?是否有其他免费的服务器替代品适合运行 Tomcat?
由于过去在某些发行版上默认提供 GCJ 内容而导致的(糟糕的)体验,我一直在传统上在服务器上安装官方 Sun Java 包。
在 Ubuntu 上这很容易,但现在 OpenJDK 是首选选项并且更容易安装......我想知道:有什么理由不使用它吗?据我所知,它是 Sun JDK 的开源版本。
仅供参考:Sun Java JDK 6u20(适用于 Ubuntu 10.04)可从Canonical Partner 存储库获得
我有一个必须做以下 3 件事的 Java 程序:
这是为大约 1,000,000 个不同的站点完成的。这应该是一项相当简单的任务,因为我只是将其他程序的部分粘在一起:testA并且testB两者都已经分别针对数千万个不同的页面毫无问题地执行了,并且下载页面的例程也已经执行了大约一百万个页面几次,也从未出现任何问题。它们都在 Ubuntu 10.4 机器上执行。
但是,当一个接一个地执行这 3 个时,无论将文件写入哪个磁盘都会崩溃。我第一次在外部 USB HD 上运行它时,我必须手动断开连接并重新连接才能恢复运行(否则 Linux 将无法识别它)。下一次,在内部 HD 上,整个系统出现故障,我不得不手动重新启动它。写入 RAM 磁盘时也发生了同样的情况。
问题是我无法真正隔离问题。发生崩溃的时间太长(大约 50 小时左右,但它是随机的),因此测试花费的时间太长,并且没有系统日志指示故障发生的位置/方式。机器或 HD 只是停止响应。
除了崩溃,一切正常。文件正常创建和删除,线程不会死亡并正常执行,并且两个测试都正常工作。更改内存或线程数对锁定时间没有影响。我已经检查过 Sockets 或类似的东西没有被关闭,但我什至不知道如何开始测试,我不知道 Java 可能会导致系统崩溃。
编辑:挂断我的意思是,当我在外部 HD 上运行它时,Linux 无法识别 HD,当我在内部 HD 或 Ram 磁盘上运行它时,计算机不会响应任何 I/O无论如何,没有任何内容写入磁盘,没有记录 cactii 日志等。例如,无法使用 SSH 连接。
程序如何运行的示例:
List<String> pagesToDownload = getFromDataBase();
for(i=0;i<NumThreads;i++){
launchTestThread();
}
Run Code Online (Sandbox Code Playgroud)
然后,在每个线程上:
String pageName = getNextPageToDownload();
File downloadedFile = downloadPage(pageName);
TestAResults testAResults …Run Code Online (Sandbox Code Playgroud) 谁能建议我如何在 tomcat 中配置我的 localhost:8080 以连接到 IP 地址而不是 localhost,这样我就可以在工作场所的任何系统中访问我的本地主机...我正在使用 tomcat6 和 netbeans 6.9.1
我使用 Ubuntu 8.04、Nginx、Passenger、Mysql、RVM 在 VPS 上托管了几个 Rails 应用程序,所以所有常见的嫌疑人。
在过去的日子里,这是我第一次真正必须调试问题并查看正在运行的进程。我可以使用passenger-status 和passenger-memory-stats 来解决这个问题,但是我对正在运行的进程数量感到很困惑,无法弄清楚。
看看这个截图,例如:http : //screencast.com/t/wUMrmy5iQPQi(取自 htop)
它显示了许多 Hudson 进程(Hudson 是我在那台机器上运行的 CI 服务器)。
我的问题是:
我尝试在我的 CentOS x64 Web 服务器中安装 JDK,看起来我已经做了一些事情:(...
现在,如何在 Centos x64 linux 中卸载 JDK 1.6.0_26?
问候,阿文德。
从 apt-get 安装东西时,我经常遇到与运行在 OpenVZ 中的 Ubuntu 服务器上的 Java 和证书相关的错误。我很确定这与 Java 分配内存的方式有关。我知道失败计数器privvmpages非常高,所以问题一定是 Java 达到了这个限制。
我已经读到服务器 VM 将预先分配大量内存来抢占性能问题,但客户端 VM 不会这样做,并且可能更适合我正在做的事情。我弄乱了 jvm.cfg 使系统转到客户端 VM,但收到一个错误,说它找不到客户端 VM。
我已经尝试用 -Xms 和 -Xmx 设置调用 Java 的脚本替换 Java 二进制文件,这解决了我从命令行调用基本内容时的问题,但在执行 apt-get 配置证书等操作时却没有解决。
我不知道接下来要尝试什么。我需要让它工作,但简单地增加privvmpages不是一个可用的选项。我在下面粘贴了实际错误。
Setting up ca-certificates-java (20100412) ...
creating /etc/ssl/certs/java/cacerts...
Could not create the Java virtual machine.
error adding brasil.gov.br/brasil.gov.br.crt
error adding cacert.org/cacert.org.crt
error adding debconf.org/ca.crt
error adding gouv.fr/cert_igca_dsa.crt
error adding gouv.fr/cert_igca_rsa.crt
error adding mozilla/ABAecom_=sub.__Am._Bankers_Assn.=_Root_CA.crt
error adding mozilla/AOL_Time_Warner_Root_Certification_Authority_1.crt
error adding mozilla/AOL_Time_Warner_Root_Certification_Authority_2.crt
error adding mozilla/AddTrust_External_Root.crt
error …Run Code Online (Sandbox Code Playgroud) 我正在使用 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 上,但我怎么知道是什么?
这里有一个简单的问题。
一个应用程序在尝试访问证书过期的网站时给了我这个异常: java.security.cert.CertificateExpiredException
所以,我更新了网站机器的证书并重新启动了它。当我尝试从 Firefox 或 Chrome 访问它时,它会加载新证书(它的到期日期设置在 2040 年附近)。
问题是,Java 应用程序似乎没有更新此证书,它似乎卡在某种内部缓存中。我已经尝试将它添加到keystore应用程序属性中并设置选项,例如-Dcom.sun.net.ssl.checkRevocation=false. 不管我做什么,它总是给我一个java.security.cert.CertificateExpiredException
有任何想法吗?
java ×10
ubuntu ×4
tomcat ×3
linux ×2
apt ×1
cache ×1
centos ×1
centos5 ×1
certificate ×1
deployment ×1
hard-drive ×1
monitoring ×1
openvz ×1
process ×1
ssl ×1
sun ×1
uninstall ×1