mirror of
https://github.com/BookStackApp/BookStack.git
synced 2026-07-17 13:43:50 +03:00
Performance Issue: Slow Page Load Times (500-700ms) on ARM64 Devices #5098
Closed
opened 2026-02-05 09:39:56 +03:00 by OVERLORD
·
5 comments
No Branch/Tag Specified
development
l10n_development
release
snyk-action
ci_and_static
mfa_key
phpstan_june26
MilnerMart/development
GamerClassN7/impersonations-for-admin
Zhey-on/feature/csp-image-css-controls-6033
tortillas5/development
llm_only
vectors
McTom234/oidc-key-algorithms
captcha_example
v26.05.2
v26.05.1
v26.05
v26.03.5
v26.03.4
v26.03.3
v26.03.2
v26.03.1
v26.03
v25.12.9
v25.12.8
v25.12.7
v25.12.6
v25.12.5
v25.12.4
v25.12.3
v25.12.2
v25.12.1
v25.12
v25.11.6
v25.11.5
v25.11.4
v24.11.4
v25.11.3
v25.11.2
v25.11.1
v25.11
v25.07.3
v25.07.2
v25.07.1
v25.07
v25.05.2
v25.05.1
v25.05
v25.02.5
v25.02.4
v25.02.3
v25.02.2
v25.02.1
v25.02
v24.12.1
v24.12
v24.10.3
v24.10.2
v24.10.1
v24.10
v24.05.4
v24.05.3
v24.05.2
v24.05.1
v24.05
v24.02.3
v24.02.2
v24.02.1
v24.02
v23.12.3
v23.12.2
v23.12.1
v23.12
v23.10.4
v23.10.3
v23.10.2
v23.10.1
v23.10
v23.08.3
v23.08.2
v23.08.1
v23.08
v23.06.2
v23.06.1
v23.06
v23.05.2
v23.05.1
v23.05
v23.02.3
v23.02.2
v23.02.1
v23.02
v23.01.1
v23.01
v22.11.1
v22.11
v22.10.2
v22.10.1
v22.10
v22.09.1
v22.09
v22.07.3
v22.07.2
v22.07.1
v22.07
v22.06.2
v22.06.1
v22.06
v22.04.2
v22.04.1
v22.04
v22.03.1
v22.03
v22.02.3
v22.02.2
v22.02.1
v22.02
v21.12.5
v21.12.4
v21.12.3
v21.12.2
v21.12.1
v21.12
v21.11.3
v21.11.2
v21.11.1
v21.11
v21.10.3
v21.10.2
v21.10.1
v21.10
v21.08.6
v21.08.5
v21.08.4
v21.08.3
v21.08.2
v21.08.1
v21.08
v21.05.4
v21.05.3
v21.05.2
v21.05.1
v21.05
v21.04.6
v21.04.5
v21.04.4
v21.04.3
v21.04.2
v21.04.1
v21.04
v0.31.8
v0.31.7
v0.31.6
v0.31.5
v0.31.4
v0.31.3
v0.31.2
v0.31.1
v0.31.0
v0.30.7
v0.30.6
v0.30.5
v0.30.4
v0.30.3
v0.30.2
v0.30.1
v0.30.0
v0.29.3
v0.29.2
v0.29.1
v0.29.0
v0.28.3
v0.28.2
v0.28.1
v0.28.0
v0.27.5
v0.27.4
v0.27.3
v0.27.2
v0.27.1
v0.27
v0.26.4
v0.26.3
v0.26.2
v0.26.1
v0.26.0
v0.25.5
v0.25.4
v0.25.3
v0.25.2
v0.25.1
v0.25.0
v0.24.3
v0.24.2
v0.24.1
v0.24.0
v0.23.2
v0.23.1
v0.23.0
v0.22.0
v0.21.0
v0.20.3
v0.20.2
v0.20.1
v0.20.0
v0.19.0
v0.18.5
v0.18.4
v0.18.3
v0.18.2
v0.18.1
v0.18.0
v0.17.4
v0.17.3
v0.17.2
v0.17.1
v0.17.0
v0.16.3
v0.16.2
v0.16.1
v0.16.0
v0.15.3
v0.15.2
v0.15.1
v0.15.0
v0.14.3
v0.14.2
v0.14.1
v0.14.0
v0.13.1
v0.13.0
v0.12.2
v0.12.1
v0.12.0
v0.11.2
v0.11.1
v0.11.0
v0.10.0
v0.9.3
v0.9.2
v0.9.1
v0.9.0
v0.8.2
v0.8.1
v0.8.0
v0.7.6
v0.7.5
v0.7.4
v0.7.3
0.7.2
v.0.7.1
v0.7.0
v0.6.3
v0.6.2
v0.6.1
v0.6.0
v0.5.0
Labels
Clear labels
🎨 Design
📖 Docs Update
🐛 Bug
🐛 Bug
:cat2:🐈 Possible duplicate
💿 Database
☕ Open to discussion
💻 Front-End
🐕 Support
🚪 Authentication
🌍 Translations
🔌 API Task
🏭 Back-End
⛲ Upstream
🔨 Feature Request
🛠️ Enhancement
🛠️ Enhancement
🛠️ Enhancement
❤️ Happy feedback
🔒 Security
🔍 Pending Validation
💆 UX
📝 WYSIWYG Editor
🌔 Out of scope
🔩 API Request
:octocat: Admin/Meta
🖌️ View Customization
❓ Question
🚀 Priority
🛡️ Blocked
🚚 Export System
♿ A11y
🔧 Maintenance
> Markdown Editor
pull-request
Mirrored from GitHub Pull Request
No Label
🐛 Bug
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: starred/BookStack#5098
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @codenamek83 on GitHub (Jan 3, 2025).
Describe the Bug
I have deployed BookStack as a Docker container on a Raspberry Pi 4 with 8 GB of RAM, using the Docker image built by LinuxServer for both BookStack and MariaDB. The server is hosted locally behind a reverse proxy. I have consistently observed slow page load times ranging from 500 to 700 ms. This issue seems to be specific to the architecture, as other platforms perform significantly better.
The load time is slow when loading the page.
The load time is normal when loading the kb-icon.png.
To isolate the problem, I created a test environment without a reverse proxy server. The Raspberry Pi and VM used for testing are hosted locally on my LAN. All tests were performed using http://ip:port.
I deployed a new BookStack stack (LinuxServer images) on an AMD64 VM with 2 GB of RAM and 1 vCPU using a Docker Compose file. The page load time was normal, and no slowness was observed.
I deployed a new BookStack stack (LinuxServer images) on an AMD64 VM with 2 GB of RAM and 1 vCPU using a Docker Compose file. I copied the data and database from my primary node to test with the actual data. The page load time was normal, and no slowness was observed.
I deployed a new BookStack stack (Solidnerd image for Bookstack) on an AMD64 VM with 2 GB of RAM and 1 vCPU using a Docker Compose file. The page load time was normal, and no slowness was observed.
I deployed a new BookStack stack (LinuxServer images) on a Raspberry Pi 4 with 8 GB of RAM, using a Docker Compose file. The page load time was between 500-800ms.
SolidNerd only provides a prebuilt image for AMD64, so I had to build a Docker image for ARM64 using the Dockerfile provided by them. I deployed a new BookStack stack (image built with SolidNerd's Dockerfile) on a Raspberry Pi 4 with 8 GB of RAM, using a Docker Compose file. The page load time was between 500–800 ms.
Based on the listed test cases, I believe the issue is somehow limited to running BookStack on ARM64 devices. Therefore, I tried the following steps to determine whether the issue lies with the Docker image or the BookStack application:
I appended
/config/nginx/site-confs/default.confto allow loading the test.php file.Test accessing the test page from browser. The page load time was normal, and no slowness was observed.
I am reporting the issue here because I feel it is very specific to the BookStack app and not the Docker environment in which it is contained. Most of the time, the Docker image maintainer can't be helpful with these types of issues. I have tried my best to gather the details and summarize them for your reference. I have also performed many other troubleshooting procedures, including database optimization and PHP optimization, but I felt they were no longer relevant to the issue.
Steps to Reproduce
I have explained the steps in the description.
Expected Behaviour
The page loads much quicker since the server is on the LAN.
Screenshots or Additional Context
The Docker Compose file used to deploy the containers:
Browser Details
No response
Exact BookStack Version
v24.12
@ssddanbrown commented on GitHub (Jan 4, 2025):
Handily, I just had reflashed my Pi4 in the last few days so have one to hand for debugging.
There's a
/statusendpoint which can be used for testing the timings of the base app load requirements (avoid any variance of instance-specific content).Raspi Hardware/OS info
Test A - Vanilla install
Setup a manual install using system packages, with nginx, default-mysql-server and PHP8.2.
PHP apt packages installed as follows:
apt install php8.2-{common,mbstring,gd,zip,xml,mysql,curl,fpm,cli}Found that opcache was active and installed as part of these.
Benchmark
Re-running, the above is on the high-end for me, I'm seeing a range of max from 100-200 generally.
Adding opcache-JIT didn't look to improve things much.
Running some (undocumented/unadvised) app cache commands (
php artisan config:cache && php artisan route:cache && php artisan view:cache) takes thisdown a little to the 60-160ms range.
Test B - Docker compose
Installed docker using system packages (
apt install docker-compose docker.io).Using a composer file based on that from the OP:
compose file
Benchmark
So this is about 5x as slow, and feels it in app too.
Test C - Docker compose with opcache added
In test B, I noticed opcache was disabled for the running PHP, so I enabled it by accessing the container
and running a
apk add php83-opcachebefore restarting that same container instance.This seemed to help:
Benchmark
Brings it down to numbers similar to Test A results.
Rough Evaluation/Thoughts
Without spending time debugging into this (getting a bit late here) my guess is that this isn't ARM specific, but the app is slow without the opcache optimizations due to using quite slow storage (assuming you're using an SD card too) while an app like BookStack relies on loading many different app/framework/library files in a short period.
Enabling the opcache then massively helps to avoid the mass reloading of files on each request.
While your test file did perform some IO, it was a simple single file write and read (which may have benefit from system buffers) compared to reading much more from many different files.
Again, didn't specifically test this theory but when debugging the compose setup I checked app-level timings and saw the actual app & database logic was minimal, but there was large proceeding app times, pointing roughly to app loading/boot.
Try hacking in the opcache extension on your instance like I did above and see if that dramatically improves things for you too.
@codenamek83 commented on GitHub (Jan 4, 2025):
Hi @ssddanbrown,
Thanks for your quick insights and recommendation. For the Raspberry Pi 4, I am not using an SD card but an SSD drive connected via the USB 3.0 interface with a USB-to-SATA adapter. The performance is definitely better than an SD card, although it is limited by what the USB port can offer. The VM used for testing is deployed on an NVMe drive.
Based on your recommendation, I built a new image using the Dockerfile provided by LinuxServer.io, with a modification to include php83-opcache. Below are the test results comparing the original LinuxServer image and the custom image I built with opcache.
Without Opcache
With Opcache
Without Opcache - VM
With Opcache - VM
I have also updated my primary Bookstack instance and observed a drastic performance gain while navigating between pages. Do you intend to perform any other tests to confirm this theory on your end? Let me know if you would like me to test anything else.
@ssddanbrown commented on GitHub (Jan 4, 2025):
Ah, okay, might still just be the underlying impact of loading many files in a non-opcache environment on this kinda hardware. Also wouldn't be surpised if non-opcache php is less optimized on ARM, since ARM is less common and has gained its popularity while opcache is an option.
Probably not, we know what helps here, and opcache is a pretty common default in most production setups these days.
Might be good to request that opcache is to the linuxserver image by default.
@codenamek83 commented on GitHub (Jan 5, 2025):
Thank you for your help, @ssddanbrown. I have reported your feedback to the LinuxServer team. Hopefully, they will consider including this extension by default, so users won’t need to build the images locally with every update or install it using a custom script.
@ssddanbrown commented on GitHub (Jan 5, 2025):
@codenamek83 Yeah, I saw they already have a PR on the go (https://github.com/linuxserver/docker-bookstack/pull/254).
Thanks for the detail you provided and the time you spent on this with a view to help.
I'll therefore close this off since there's no changes due to the core codebase.