使用 Java 使我的磁盘崩溃

Pha*_*dek 6 hard-drive java

我有一个必须做以下 3 件事的 Java 程序:

  1. 从网站下载文件。
  2. 通过 testA 和 testB 运行文件(均在 java 中)
  3. 删除文件并将测试结果保存在磁盘上。

这是为大约 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 = runTestA(downloadedFile);
TestBResults testBResults = runTestB(downloadedFile);
writeToDatabase(downloadedFile, testAResults, testBResults);
downloadedFile.delete();
Run Code Online (Sandbox Code Playgroud)

单独的函数runTestArunTestB并且downloadedPage适用于更大数量的文件,但是当以这种方式调用时,它们不会。并且在完全相同的硬件上。

EDIT2:我想我排除了硬件问题。过去 7 天,硬件密集型软件一直在同一台机器上运行,没有任何问题。无论如何,只要我能得到一台未使用的机器,我就会在其中测试程序。

此外,测试中的所有内容都被写入数据库,直到发生崩溃为止,并且数据是正确的。该downloadedFile不作为writeToDatabase方法中的参数,只是它的名称和大小通过。

最后,我对内存或文件处理程序泄漏做了一些广泛的检查,但没有发现,包括在工作测试中。现在,我的钱花在了文件删除的一些奇怪错误上。

EDIT3:我终于设法得到另一台机器来测试例程。另一个硬件,但相同的 Ubuntu 版本 (10.4 LTS)。它也在那里崩溃,所以我真的怀疑这是硬件问题。这会留下操作系统错误、JVM 错误或编程错误(没有 JNI 或类似的东西在运行)。我将尝试在其他环境中运行测试(在 FreeBSD 中设置测试非常容易,我可以尝试找到一台 Windows 机器来测试)以验证这一点。

EDIT4:回答 Bob Cross 关于文件有多大的问题,它们是典型的网页,平均大约 20kb。我必须删除它们,因为它的想法是扩展应用程序,使磁盘使用无法忍受。但我会尽快尝试删除免费运行。我运行这些测试的机器现在正在使用,我很难得到一些空闲的硬件。

eri*_*son 6

如果系统停止响应,则是操作系统中的错误或硬件问题。一个程序不应该挂起一个系统,无论多么错误。

在不同的系统上运行你的程序,看看它是否为你的程序提供了有用的诊断,而不是仅仅停留在上面。


小智 0

...没有具体信息很难说。

文件写入后,IO 流是否全部关闭?你在unix上设置了一些IO限制吗?是否存在并发问题,因为它们同时修改文件?也许您也可以偶尔进行一些 Thread.sleep(...) 以避免磁盘饱和。

...但实际上,我不知道,这些只是我的两分钱。