Tôi đang cố gắng gỡ lỗi rò rỉ bộ mô tả tệp trong một ứng dụng web Java chạy trong Jetty 7.0.1 trên Linux.IOException: Quá nhiều tệp đang mở
Ứng dụng đã hoạt động một cách vui vẻ trong một tháng hoặc lâu hơn khi yêu cầu bắt đầu không thành công do quá nhiều tệp mở và Jetty phải được khởi động lại.
java.io.IOException: Cannot run program [external program]: java.io.IOException: error=24, Too many open files
at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)
at java.lang.Runtime.exec(Runtime.java:593)
at org.apache.commons.exec.launcher.Java13CommandLauncher.exec(Java13CommandLauncher.java:58)
at org.apache.commons.exec.DefaultExecutor.launch(DefaultExecutor.java:246)
Lúc đầu, tôi nghĩ vấn đề là với mã mà ra mắt chương trình bên ngoài, nhưng nó sử dụng commons-exec và tôi không thấy bất cứ điều gì sai với nó:
CommandLine command = new CommandLine("/path/to/command")
.addArgument("...");
ByteArrayOutputStream errorBuffer = new ByteArrayOutputStream();
Executor executor = new DefaultExecutor();
executor.setWatchdog(new ExecuteWatchdog(PROCESS_TIMEOUT));
executor.setStreamHandler(new PumpStreamHandler(null, errorBuffer));
try {
executor.execute(command);
} catch (ExecuteException executeException) {
if (executeException.getExitValue() == EXIT_CODE_TIMEOUT) {
throw new MyCommandException("timeout");
} else {
throw new MyCommandException(errorBuffer.toString("UTF-8"));
}
}
Bảng liệt kê các file mở trên máy chủ Tôi có thể thấy số lượng FIFO cao:
# lsof -u jetty
...
java 524 jetty 218w FIFO 0,6 0t0 19404236 pipe
java 524 jetty 219r FIFO 0,6 0t0 19404008 pipe
java 524 jetty 220r FIFO 0,6 0t0 19404237 pipe
java 524 jetty 222r FIFO 0,6 0t0 19404238 pipe
khi Jetty bắt đầu chỉ có 10 FIFO, sau vài ngày có hàng trăm FIFO.
Tôi biết có chút mơ hồ ở giai đoạn này, nhưng bạn có bất kỳ đề xuất nào về vị trí tiếp theo hay cách nhận thông tin chi tiết hơn về các bộ mô tả tệp đó không?
Hãy xem một số mã –
Đã thêm mã khởi chạy chương trình bên ngoài. –
Là nguồn bổ sung của informaiton netstat -anp --tcp | grep --color có thể là –
zaletniy