When it comes to hosting Moodledata on AWS, choosing the right storage solution is crucial for optimal performance. In this evaluation, we compare the performance of Amazon Elastic Block Store (EBS), Elastic File System (EFS), and Network File System (NFS) in the AWS Ireland region, using Moodle version 4.3 on a single T3 medium machine running Ubuntu 22.04.
Why the EFS and NFS are in scope ?
due to horizontal scaling or setting up moodle cluster, we need a shared storage
Why EBS then ?
just to compare the performance agianst shared storage
Why EFS standard is not in scope?
That’s add additional overhead due to multi az replication, so, slower than One zone EFS [30%]
Setup Details
- Moodle data is hosted on a separate gp3 disk with a size of 50 GB, attached to the machine.
- Two types of benchmarking are conducted:
- Disk speed test
- Using the Moodle benchmark report plugin (assuming localcache is already on the local disk)
Performance Comparison
Storage Type | Speed (MB/s) | Moodle Benchmark Report (Performance) | Configuration |
EBS | 775 | 0.143 | GP3 / 50 GB |
EFS Standard | 130 | 24.8 | Standard, EFS SIZE 1 GB |
EFS One Zone | 160 | 15.6 | Standard, One Zone, EFS size: 1GB, Same AZ |
NFS | 190 | 14.3 | Ubuntu, m5.large, GP3, Same AZ |
Moodle Data Directory Structure for a cluster
Directory | Location | Locking | Performance Impact | Other Storage Option | Usage | |
Datadir | Shared storage | EFS / NFS | Defaut: all directory part of data dir and can contain more directory like land / repositories/ antivirus | $CFG->dataroot | ||
filedir | Shared storage | Low | S3 / any other filesystem | Actual uploaded files are here | $CFG->filedir | |
cachedir | Shared storage | Locking required | High | redis/mongo | Internally used for caching, not directly replaceable as component file is used | $CFG->cachedir |
muc | Shared storage | Locking required | redis/mongo | Internally used for caching | $CFG->altcacheconfigpath | |
sessions | Shared storage | REDIS/DB | $CFG->session_file_save_path | |||
tempdir | Shared storage | Locking required | EFS/ NFS | Internally used for processing | $CFG->tempdir | |
backuptempdir | Shared storage | EFS/NFS | $CFG->backuptempdir | |||
localcache | Can be local to machine | $CFG->localcachedir | ||||
trashdir | Can be local | $CFG->trashdir |
- Though Overall performance can be better if we utilize the MOODLE EFS / NFS with redis cache as it can remove many Hits from moodle data filesystem
- To more optimize Setting UP session in Redis / Database can also help
$CFG->session_handler_class = '\core\session\file';
$CFG->session_file_save_path = $CFG->dataroot.'/sessions';
- We can also remove the cachefile dependency from shared storage
$CFG->alternative_component_cache = '/local/cache/dir/core_component.php' would point to local node cache directory.
NOTE: Before upgrade the administrator MUST have to manually execute following on each node:
$ php admin/cli/alternative_component_cache.php --rebuild
- MUC contains a config file which changes if there is any change in Cache configuration and contains custom cache store as well as their mapping. Let’s say you add a redis store and map it. This information will be under this directory
$CFG->altcacheconfigpath = '/var/www/localmoodledata/muc/';
My Solution using One zone EFS / NFS
Datadir | One zone EFS / NFS |
filedir | EFS/ NFS / S3 |
cachedir | One Zone EFS / NFS |
tempdir | One Zone EFS / NFS |
sessions | REDIS |
Cache * | REDIS |
localcachedir | Local EBS |
trashdir | ONE ZOne EFS / NFS |
alternative_component_cache | Local EBS on each node |
- cachedir should be on efs, but redis can be utilized to store cache then it will not much use of cachedir
Performance Comparison Detail
- note : the below comparison is done on a moodle setup but does not use redis for cache
- data dir on efs /nfs, localcachedir on ebs , cache core componenet file on local ebs
EBS
- 50 GB GP3 volume mounted on EC2 utilized for moodle data
Disk Speed Test
Moodle Benchmark Report
EFS One Zone
- One Zone EFS to improve performance, EFS initial size is 1 GB, so minimum IOPS are there
Disk Speed Test
Moodle Benchmark Report
NFS
- Ubuntu 22.04 with GP3 Disk of 50 GB setup in same az
Disk Speed Test
Moodle Benchmark Report
Setting up NFS -server and client
NFS server : following steps are done on a ubuntu 22.04 machine with 1 root volume 8gb and another 100 gb volume used for NFS is available at /dev/nvme1n1 [use *lsblk* command for dev output ]
sudo apt update -y && sudo apt upgrade -y
sudo apt install nfs-kernel-server lvm2
# Physical volume
sudo pvcreate /dev/nvme1n1
# virtual volume group
sudo vgcreate vg1 /dev/nvme1n1
# you can check by : >> sudo pvs or >> sudo vgs
# create logical volume
sudo lvcreate -n lv1 -l 100%FREE /dev/vg1
# you can check by : >> sudo lvs
# then create a file system
sudo mkfs.xfs /dev/vg1/lv1
mkdir /nfs1
# entry in fstab file
/dev/vg1/lv1 /nfs1 xfs defaults 0 0
mount -a
# add entry in /etc/exports
/nfs1 *(rw,sync,no_root_squash,no_subtree_check)
sudo systemctl restart nfs-kernel-server
NFS Client
sudo apt install nfs-common
mkdir /nfsmoodledata
#fstab entry
[NFS server ip]:/nfs1 /nfsmoodledata nfs defaults 0 0
mount -a
Shareable EBS
AWS Also supports sharing EBS volume among multiple ec2 in same az for upto 12 ec2. BUT XFS file system does not support locking by attaching multiple ec2 , still we need an distributed file system over there.
I have evalauted by attaching to multiple ec2, but, disk got corrupted and needed remounted again and again if requests are coming from multiple ec2 using XFS file system
Conclusion
While overall performance can be improved by utilizing Moodle with EFS/NFS and Redis cache, setting up sessions in Redis/Database and optimizing cache file dependencies on shared storage can further enhance the system. Consider implementing a solution using One Zone EFS for better performance, keeping in mind the specific configurations for each storage type. Choose the setup that aligns with your Moodle instance’s requirements and infrastructure constraints.
You can alos browse my post about EFS vs Redis for Caching soltuion