Storage
Also known as: Ceph filesystems (CephFS).
Overview
The following filesystems are generally accessible from all nodes in the cluster:
/home- home directory, max. 250GB and 1M files / user, SSD/NVME
- best for code and configuration
- avoid intensive inputs/outputs during the job
- has read+write access from the login node, read+write access from the compute nodes
/local- long-term storage, slow and large (~2PB total), HDD
- best for large-ish files that need to be accessed rarely, and can be accessed sequentially
- avoid dealing with millions of small (<1MB) files, or doing millions of small operations (e.g. log file writing)
- has read+write access from the login node, read+write access from the compute nodes
/cms/store- backed by the same physical disks as
/local, so the same characteristics apply - can be read by anyone, requires grid certificate for writing and deletion
- meant for storing CMS datasets and output files of grid jobs
- backed by the same physical disks as
/scratch/local- storage during job runtime only, fast and ephemeral, SSD/NVME
- best for temporary outputs (e.g. log files, job otuputs) while the job is running
- the logical path
/scratch/localmay map to different underlying physical hardware on different nodes, so data cannot be shared across nodes - no guarantee of data storage beyond the lifetime of the job: you should delete your outputs at the end of the job
- has read+write access from the compute nodes
/scratch/persistent- medium term fast storage, up to a few tens of TB shared between all projects, SSD/NVME
- best for jobs that require high-speed inputs that need to be accessed randomly, e.g. small sets of frequently accessed NANOAOD, ML input datasets
- has read+write access from the login node, read-only access from the compute nodes
To get an overview of your disk usage, run:
show_storage
Example output:
Environment Path Used(/quota) Files[files,dirs](quota) F/D-ratio
============== ============== ============== ============== ==============
- /home/user 103GB(250GB) 308K[252K,56K](1.0M) .0044
- /local/user 237TB 200K[168K,33K] .0050
- /cms/store/user/cms_user 37TB 440K[430K,10K] .0429
Notes
File to dir ratio should be between 0.1-1
Accessing CephFS
CephFS supports the standard POSIX commands (cd, ls, du, find, etc).
However, when gathering statistics about directories, it may be faster to query the file system directly with the getfattr command:
getfattr -n <attribute> <directory>
where the <attribute> can be any of the following:
ceph.dir.files-- number of files, including hidden;ceph.dir.subdirs-- number of subdirectories, including hidden;ceph.dir.entries-- sum ofceph.dir.filesandceph.dir.subdirs;ceph.dir.rfiles-- same asceph.dir.files, but recursively summed;ceph.dir.rsubdirs-- same asceph.dir.subdirs, but recursively summed;ceph.dir.rentries-- sum ofceph.dir.rfilesandceph.dir.rsubdirs;ceph.dir.rbytes-- total number of bytes allocated by the directory;ceph.quota.max_files-- maximum number of files allowed in the directory;ceph.quota.max_bytes-- maximum number of bytes allowed for the directory.
For example, to count the total number of files in your home directory, you can run the following:
getfattr -n ceph.dir.rfiles ~
Note
To get rid of the message getfattr: Removing leading '/' from absolute path names, you can either
redirect it into /dev/null by appending 2>/dev/null to the command, or use the
--absolute-names option of getfattr.
In case you want to print out the total number of files in each subdirectory that is located in your home directory, you can accomplish that with:
getfattr -n ceph.dir.rfiles ~/*/
To sort the directories by the number of files stored in each, you can do something along the lines of:
for d in ~/*/; do \
echo $d $(getfattr --absolute-names --only-values -n ceph.dir.rfiles "$d"); \
done | sort -nr -k2
You can proceed similarly when estimating the space usage of each directory:
for d in ~/*/; do \
echo $d $(getfattr --absolute-names --only-values -n ceph.dir.rbytes "$d"); \
done | \
sort -nr -k2 | \
awk '{cmd="numfmt --to=si --suffix=B <<< "$NF; cmd | getline $NF; close(cmd); print}'