From 2a6437600b68330a46f85741c5eea8857fc0d409 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Sat, 17 Feb 2024 17:52:41 +0100 Subject: [PATCH] Step --- .../2024-ram-usage-encryption-s3/index.md | 88 ++++++++++++++---- .../search-body.png | Bin 0 -> 30774 bytes .../search-meta.png | Bin 0 -> 22092 bytes 3 files changed, 71 insertions(+), 17 deletions(-) create mode 100644 content/blog/2024-ram-usage-encryption-s3/search-body.png create mode 100644 content/blog/2024-ram-usage-encryption-s3/search-meta.png diff --git a/content/blog/2024-ram-usage-encryption-s3/index.md b/content/blog/2024-ram-usage-encryption-s3/index.md index 505a2ff..b7ed6db 100644 --- a/content/blog/2024-ram-usage-encryption-s3/index.md +++ b/content/blog/2024-ram-usage-encryption-s3/index.md @@ -100,12 +100,7 @@ UID FETCH 2 (RFC822.HEADER BODY.PEEK[2]<0.10240>) Flags, date, headers -``` -SEARCH UNDELETED SINCE 2023-11-17 -UID SEARCH HEADER "Message-ID" "" UNDELETED -UID SEARCH 1:* UNSEEN -UID SEARCH BEFORE 2024-02-09 -``` + --> @@ -175,7 +170,7 @@ copy a same email multiple times in RAM. It seems that in this first test that Aerogramme is particularly sensitive to 1) login commands due to argon2 and 2) large emails. -### Copy and Move +### Re-organizing your mailbox You might need to organize your folders, copying or moving your email across your mailboxes. COPY is a standard IMAP command, MOVE is an extension. @@ -193,7 +188,7 @@ to keep the UI responsive. While CPU optimizations could probably be imagined, I find this behavior satisfying, especially as memory remains stable and low. -### Setting flags +### Messing with flags Setting flags (Seen, Deleted, Answered, NonJunk, etc.) is done through the STORE command. Our run will be made in 3 parts: 1) putting one flag on one email, 2) putting 16 flags on one email, and 3) putting one flag on 1k emails. @@ -255,37 +250,96 @@ that maintain a socket opened. These commands are sensitive, as while many proto are one shot, and then your users spread their requests over time, with these commands, all your users are continuously connected. -In the graph below, we plot the resource usage of 16 users that log into the system, -select inbox, and switch to IDLE, then, one by one, they receive an email and are notified. +In the graph below, we plot the resource usage of 16 users with a 100 emails mailbox each that log into the system, +select their inbox, switch to IDLE, and then, one by one, they receive an email and are notified. ![Idle Parallel](05-idle-parallel.png) +Memory usage is linear with the number of users. +If we extrapolate this observation, it would imply that 1k users = 2GB of RAM. + +That's not something negligible, and it should be observed closely. +In the future, if it appears that's an issue, we could consider optimizations like 1) unloading the mailbox index +and 2) mutualizing the notification/wake up mechanism. + + ## Query Commands -`FETCH 1:* ALL` +### Fetching emails + +Often, IMAP clients in first instance, are only interested by email metadata. +For example, the ALL keyword fetches some metadata, like flags, size, sender, recipient, etc. +Ressource usage of fetching this information on 1k email is depicted below. ![Fetch All 1k mail](06-fetch-all.png) -`FETCH 1:* FULL` +CPU spike is short, memory usage is low: nothing alarming in term of performances. -![Fetch Full 1k mail](07-fetch-full.png) +IMAP standardizes another keyword, FULL, that also returns the "shape" of a MIME email as an S-Expression. +Indeed, MIME emails can be seen as a tree where each node/leaves are a "part". -Which crashed the Garage server: +In Aerogramme, this shape is - as of 2024-02-17 - not pre-computed and not save in database, and thus, the full email must be fetched and parsed. + +So, when I tried to fetch this shape on 1k emails, Garage crashed: ``` ERROR hyper::server::tcp: accept error: No file descriptors available (os error 24) ``` -`SEARCH` +Indeed, `ulimit` is set to 1024 on my machine, and apparently, I tried to open more than 1024 descriptors +for a single request... It's definitely an issue that must be fixed, but for this article, +I will increase the limit to make the request succeed. +I get the following graph. -*TODO* +![Fetch Full 1k mail](07-fetch-full.png) -`LIST` +With a spike at 300MB, it's clear we are fetching the full mailbox before starting to process it. +While it's a performance issue, it's also a stability/predictability issue: any user could trigger huge allocations on the server. + + +### Searching + + + + + +First, we start with a SEARCH command inspired by what we have seen in the logs on the whole mailbox, and that can be run +without fetching the full email from the blob storage. + +![Search meta](./search-meta.png) + +Spike order: 1) artifact, ignored, 2) login+select, 3) search, 4) logout +We load ~10MB in memory to make our request that is quite fast. + +But we also know that some SEARCH requests will require to fetch some content +from the S3 object storage, and in this case, the profile is different. + +![Search body](./search-body.png) + +We have the same profile as FETCH FULL: a huge allocation of memory and a very CPU intensive task. +The conclusion is similar to FETCH: while these commands are OK to be slow, it's not OK to allocate so much memory. + +### Listing mailboxes *TODO* --- +## Discussion + + + ## Conclusion *TBD* diff --git a/content/blog/2024-ram-usage-encryption-s3/search-body.png b/content/blog/2024-ram-usage-encryption-s3/search-body.png new file mode 100644 index 0000000000000000000000000000000000000000..fba9beb0fa5cc94bd8b22b5652e576c5a9a574ef GIT binary patch literal 30774 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 Vql_sT^zfxLx9?F;+-iF6e*jJ^vX=k= literal 0 HcmV?d00001 diff --git a/content/blog/2024-ram-usage-encryption-s3/search-meta.png b/content/blog/2024-ram-usage-encryption-s3/search-meta.png new file mode 100644 index 0000000000000000000000000000000000000000..eee79562b2f04ec8023f75ab19a1512574b0e105 GIT binary patch literal 22092 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%0D2_<4HZi7h7Ow-RRhc?K+!g73)- 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 IKMDK#Pc