ARTIFACTORY: How to identify the root cause of high disk I/O and throughput that caused failed download with closed connections

Products
Frog_Artifactory
Content Type
Administration_Platform
AuthorFullName__c
Paul Pan
articleNumber
000006957
FirstPublishedDate
2026-05-11T09:03:33Z
lastModifiedDate
2026-05-11

ARTIFACTORY: How to identify the root cause of high disk I/O and throughput that caused failed download with closed connections

Introduction 

High disk I/O and throughput on local disk can create significant impact on artifactory performance which may result in download failure with closed connections or even system crash.
Even with direct upload binary providers, artifactory do still have load on local disk because of cache-fs/logs and other tmp files.
Additionally, applications like reverse proxy that run on the same vm as artifactory might also create high disk I/O when they are not configured correctly.
Here we will show some common causes and ways to identify the issues.


Identified the root cause and potential fix
  1. Identify the Culprit Process
    The fastest way to see "who is doing it" is iotop. It works exactly like the standard top command but for disk usage.
Command:
sudo iotop -oPa
-o: Only show processes actually doing I/O (hides idle ones).
-P: Show processes instead of individual threads (easier to read).
-a: Accumulate I/O (useful to catch processes that write in short, fast bursts).

Look at the DISK WRITE and DISK READ columns. The top entry is your culprit. Note the PID and the Command name.

 If iotop change too fast, try pidstat:
# Print IO stats every 1 second, 10 times
pidstat -d 1 10
  1. Identify what is getting read/write. Once you have the PID from iotop (e.g., PID 1234), you need to know what file it is writing to. Is it a log file? A temp file?
# List open files for a specific PID, looking for regular files (REG)
sudo lsof -p 1234 | grep REG

Look at the file paths on the right.
If you see a log file (e.g., catalina.out or access.log) growing rapidly, you have a "log spam" issue.
  1. Deep Dive: "Why are you writing?"
If lsof shows the files but you don't understand why the process is touching them so aggressively, you can snoop on the system calls.
Command: (Warning: This slows down the process slightly. Use for short bursts, e.g., 5 seconds).
# Trace write operations for the PID
sudo strace -f -e trace=write -p 1234

You will see a stream of data being written.
write(3, "Error: Connection refused...", 28) -> The app is in an error loop filling up logs.
write(5, <binary data>, 4096) -> It is dumping binary data (likely database or file copy).

  1. Rule out Hardware Failure
    Sometimes high "throughput" is actually retries. If a disk sector is bad, the drive controller might try to read it 50 times in a row, which looks like high activity but zero actual data transfer.
dmesg -T | grep -iE 'disk|scsi|error' | tail -n 20
Look for: "I/O error", "sector", or "reset". If you see these, your physical disk (or SAN volume) is failing.

Based on the above output, we might identify a few common heavy i/o:
  1. Nginx that is on the same vm as artifactory or other log monitoring tools
  2. Heavy write to log files
  3. Heavy write to eventual folder
  4. Heavy write to cache folder


For case 1, you will want to check your nginx config and it’s out of the scope for this articles

For case 2, check if you have enabled a very verbose logger and turn it off if not needed.

For case 3, eventual binary provider is no longer recommended. Consider switching to a direct provider. https://jfrog.com/help/r/artifactory-how-to-migrate-from-eventual-to-direct-upload-mechanism/artifactory-how-to-migrate-from-eventual-to-direct-upload-mechanism

For case 4, The direct upload provider still utilizes write to disk during put request because of cache-fs. Artifactory will save stream to cache _pre, validate integrity and copy to cache folder so that the upload is immediately available locally.

If you have already tuned up the cache fs size to a reasonably large number and your disk i/o or throughput limit is already at a high level that can’t be lifted, you might consider turning off this feature. 
You can disable this by setting skipDuringUpload to true for cache-fs provider in binarystore.xml

<provider type="cache-fs" id="cache-fs">
          …
         <skipDuringUpload>true</skipDuringUpload>
    </provider>