Self-Hosted Bitrix24 Performance Tuning: Make Your Portal Fast
A slow self-hosted Bitrix24 portal almost always traces back to one of four root causes: under-provisioned hardware, an untuned PHP runtime, a misconfigured database, or disabled caching layers. Fix those, and response times routinely drop from several seconds to under one second.
Why Self-Hosted Portals Slow Down
The most common performance killers on a self-hosted Bitrix24 (Alaio) are preventable: wrong PHP version, disabled OPcache, an undersized InnoDB buffer pool, and caching layers left at their defaults - any one of them can double page-load times under real user load.
Unlike the cloud edition, on-premise deployments hand you full control of the stack - but that means every bottleneck is also your responsibility. Based on ACP Group's experience across 1,300+ Bitrix24 projects, slowdowns cluster around a predictable set of culprits:
- PHP running below version 8.2 (or with OPcache off)
- MySQL
innodb_buffer_pool_sizesized for a dev box, not production - Managed cache and HTML cache disabled in the Bitrix performance panel
- Composite site mode turned off on public-facing pages
- Push & Pull server not configured, causing realtime features to poll on short intervals
- Static files served by PHP instead of the web server
- Modified core files that prevent updates and introduce unpredictable overhead
- Disk I/O contention when database files live on spinning HDD rather than SSD
The sections below address each layer in sequence, from hardware through application-level caching.
Right-Sizing Server Hardware
Match CPU, RAM, and storage tier to your actual concurrent user count before touching any software setting - under-provisioned hardware makes every other tuning effort irrelevant.
Bitrix24's own load-test data and field experience point to the following comfortable baseline configurations (as of 2026):
| Users | CPU | RAM | Storage recommendation |
|---|---|---|---|
| Up to 50 | 4-core Xeon, ~3.4 GHz | 8-12 GB DDR4 | SSD for DB files |
| 50-100 | 4-core Xeon, ~3.4 GHz | 16-24 GB DDR4 | SSD for DB files |
| 100-500 | 8-core Xeon, ~3.2 GHz | 32 GB DDR4 | SSD for DB + HDD for portal files |
| 500-1,000 | 12-core Xeon | 64 GB DDR4 | SSD for DB + HDD for portal files |
| 1,000-5,000 | 12-core Xeon | 128 GB DDR4 | NVMe/SSD for DB |
| 5,000+ | 2 × 12-core Xeon | 128 GB DDR4 per node | Cluster - see below |
Key hardware rules:
- Database files must be on SSD (or NVMe). Spinning HDD for InnoDB data causes severe I/O wait under concurrent load.
- Portal/upload files can live on HDD to reduce cost, but separate the volumes.
- Minimum RAM for any production portal is 16 GB - the 2 GB minimum in the spec sheet is for installation only.
- For 1,000+ users, a two-tier cluster (dedicated DB servers + application servers) is the standard path. Load-test results from an Enterprise cluster showed sub-1-second response for thousands of concurrent sessions using two application servers and two database servers.
For a detailed sizing reference, see Self-Hosted Bitrix24: Hardware Sizing Guide for 50 to 1,000 Users.
PHP Runtime: Version and OPcache
Run PHP 8.2 at minimum - it is the hard floor for Bitrix24 updates as of 2026 - and enable OPcache; without it, every page request recompiles every file from source, typically adding 300-800 ms of pure CPU time.
Version requirements
- Minimum: PHP 8.2 (enforced since 1 March 2024; portals on older versions cannot receive platform updates)
- Recommended: PHP 8.3 or the latest stable release
- PHP 8.1 reached end-of-life upstream and receives no security fixes
Required extensions
| Extension | Purpose |
|---|---|
| OPcache | Bytecode cache - eliminates recompilation |
| GD | Charts, CAPTCHA, image processing |
| PHP XML | Update system |
| FreeType | CAPTCHA rendering |
| Zlib | Compression for updates and responses |
| mbstring | Multi-byte string handling (set mbstring.func_overload=0) |
Critical php.ini settings
memory_limit = 256M
default_charset = UTF-8
mbstring.func_overload = 0
session.use_trans_sid = 0
opcache.enable = 1
opcache.memory_consumption = 256
opcache.max_accelerated_files = 20000
opcache.revalidate_freq = 60
Note:
mbstring.func_overloadmust be exactly0. Any other value blocks platform updates and causes unpredictable string-handling bugs. This is a common legacy misconfiguration found during audits.
Upgrade path
- Back up the entire installation (database + files).
- Update all platform modules and Marketplace solutions to latest versions.
- Change the PHP version in your server environment (or via the VMBitrix menu: Manage servers → Update PHP and MySQL).
- Re-run the update check after the PHP upgrade.
Database Tuning (MySQL / MariaDB)
The single highest-impact database change is sizing innodb_buffer_pool_size to 60-70 % of available RAM - this keeps the working dataset in memory and eliminates most random-read I/O on the database server.
Bitrix24 works with MySQL 8.x (Percona Server recommended) or MariaDB. PostgreSQL is supported only on the Enterprise for Postgres license. Oracle and MSSQL are not supported.
Key parameters to review
| Parameter | Common misconfiguration | Recommended direction |
|---|---|---|
innodb_buffer_pool_size |
Default 128 MB | 60-70 % of DB server RAM (e.g., 34 GB on a 48 GB server) |
innodb_log_file_size |
64 MB (too small) | 1-2 GB for write-heavy workloads |
query_cache_type |
Enabled | Disable - query cache causes contention under concurrency |
local_infile |
ON | Set to OFF (security + performance) |
sync_binlog |
1 | Increase to 1000 for non-critical replicas to reduce fsync overhead |
max_connections |
Default 151 | Set based on actual concurrent users (load tests used 305+) |
max_heap_table_size |
Default | 256 MB for in-memory temp tables |
join_buffer_size |
32 MB | Tune down to 4-8 MB per connection (large values waste RAM) |
sort_buffer_size |
32 MB | Tune down to 4-8 MB per connection |
Slow query log
Enable the slow query log (slow_query_log = ON, long_query_time = 1) during a representative working period, then review the output. In typical projects, 80 % of query time comes from fewer than 10 query patterns - usually missing indexes on CRM entity tables or unoptimised custom modules.
Bitrix24 Caching Layers
Bitrix24 ships with three distinct caching tiers - managed cache, HTML cache, and composite mode - and leaving all three at defaults is the fastest free performance win available to any self-hosted portal.
A request flows through the caching stack before reaching PHP and the database.
flowchart LR
BROWSER[Browser / Client] --> WEBSERVER[nginx / Apache]
WEBSERVER -->|Static file hit| STATIC[Static File Cache\nlong expires + CDN]
WEBSERVER -->|Composite page hit| COMPOSITE[Composite Mode\nFull-page HTML snapshot]
COMPOSITE -->|Cache miss| PHP[PHP 8.2+ / OPcache]
WEBSERVER -->|Dynamic request| PHP
PHP -->|HTML cache hit| HTMLCACHE[HTML Cache\nPage fragment cache]
HTMLCACHE -->|Cache miss| MANAGED[Managed Cache\nMemcached / Redis]
MANAGED -->|Cache miss| DB[(MySQL / MariaDB\nInnoDB buffer pool)]
PHP --> PUSHPULL[Push & Pull Server\nRealtime events]
Managed cache (Memcached / Redis)
Enable in Settings → Performance → Caching. Managed cache stores computed PHP objects - user sessions, CRM entity lookups, permission matrices - so they are not recalculated on every request. For portals with more than 100 users, allocate at least 512 MB of dedicated cache memory.
HTML cache
HTML cache stores rendered page fragments. Enable per-component or globally. Particularly effective for intranet news feeds, workgroup pages, and CRM list views that do not change on every load.
Composite site mode
Composite mode generates a full static HTML snapshot of a page and serves it instantly to returning visitors, with only dynamic widgets loaded asynchronously. It is most impactful for public-facing Bitrix24 sites and portals with many anonymous or lightly-personalised pages.
Built-in performance panel
Navigate to Settings → Performance in the admin panel. This panel shows cache hit rates, slow component timings, and flags common misconfigurations. Review it before making any other change - it often surfaces the highest-impact issue within seconds.
Push & Pull Server: Realtime Without Polling
Without a properly configured Push & Pull server, every Bitrix24 realtime feature - chats, task updates, telephony, calendars - falls back to short-interval HTTP polling, generating 5-20× more database and PHP load than a properly configured push connection.
As of early 2021, Push & Pull is mandatory for the web messenger module. The supported options are:
- Bitrix Push Server 2.0 (local, self-hosted on the same or a dedicated server) - recommended for on-premise deployments with data-sovereignty requirements
- Bitrix24 cloud push - simpler to configure but routes realtime traffic through an external server
Older push server versions (Nginx-PushStreamModule 0.3.4/0.4.0 and Bitrix Push Server 1.0) are no longer supported. If you are running either, migrate to Push Server 2.0 immediately.
Push & Pull serves: chats, tasks, calendars, news feed, workgroups, RPA, mobile app, telephony, sales centre, document generator.
Configure at: Settings → Product settings → Module settings → Push and Pull.
Static Files, Long Expires, and CDN
Serving static assets (JS, CSS, images) with long Cache-Control: max-age headers and offloading them to a CDN removes the single largest share of repeated load from your application server - typically 60-80 % of HTTP requests by count.
Recommendations:
- Configure nginx to serve all
/bitrix/js/,/bitrix/css/,/upload/, and/bitrix/images/paths directly, bypassing PHP entirely. - Set
Cache-Control: max-age=31536000, immutablefor versioned assets. - Enable Gzip or Brotli compression on the web server for all text assets.
- For portals with geographically distributed users (common in MENA and international deployments), put a CDN in front of static paths. The dynamic portal itself stays on-premise; only static files are edge-cached.
- Use the Bitrix24 site-boost settings (Optimize page load time and Defer image loading) for any public-facing Bitrix24 site - these defer non-critical rendering and lazy-load off-screen images without code changes.
Common Bottlenecks: Symptoms, Causes, and Fixes
Use this table as a first-response diagnostic when users report slowness - matching the symptom to the right layer saves hours of unfocused investigation.
| Symptom | Likely cause | Fix |
|---|---|---|
| All pages slow, high CPU on web server | OPcache disabled or misconfigured | Enable OPcache; set opcache.memory_consumption ≥ 256 |
| Slow CRM list and deal pages only | Missing DB indexes; large InnoDB buffer pool miss | Enable slow query log; increase innodb_buffer_pool_size |
| Chats / tasks not updating in realtime, high DB load | Push & Pull server not configured | Install and configure Bitrix Push Server 2.0 |
| Slow first load, fast subsequent loads | HTML cache or composite mode disabled | Enable HTML cache; enable composite mode for static-heavy pages |
| High disk I/O wait on DB server | Database files on HDD | Migrate DB data directory to SSD/NVMe |
| Portal slow only for remote/international users | No CDN; large uncompressed assets | Add CDN for static; enable Gzip/Brotli on web server |
| Updates fail; PHP warnings in logs | mbstring.func_overload ≠ 0; PHP < 8.2 |
Set mbstring.func_overload=0; upgrade PHP to 8.2+ |
| Intermittent slowness after custom development | Modified core files causing conflicts | Audit core modifications; move logic to custom modules |
| Memory exhausted errors | memory_limit too low |
Set memory_limit = 256M (minimum) in php.ini |
| Slow file uploads / drive operations | Upload directory on slow storage | Move /upload/ to SSD-backed volume |
Performance Quick-Wins Checklist
Run through this checklist on any slow portal before engaging in deeper investigation - in ACP Group's audit practice, at least half of performance complaints are resolved by items in this list alone.
✅ PHP layer
- PHP version is 8.2 or higher (8.3 recommended as of 2026)
- OPcache is enabled with ≥ 256 MB memory and
opcache.max_accelerated_files ≥ 20000 memory_limit = 256Mor higher in php.inimbstring.func_overload = 0confirmedsession.use_trans_sid = 0confirmed
✅ Database layer
- MySQL 8.x / Percona Server (or MariaDB equivalent) in use
innodb_buffer_pool_sizeset to 60-70 % of DB server RAMinnodb_log_file_size≥ 1 GB- Query cache disabled (
query_cache_type = 0) local_infile = OFF- Slow query log enabled and reviewed
- Database files on SSD/NVMe storage
✅ Bitrix24 caching
- Managed cache (Memcached/Redis) enabled in Performance panel
- HTML cache enabled for high-traffic components
- Composite mode enabled for public/semi-static pages
- Performance panel reviewed for flagged issues
✅ Realtime and push
- Push & Pull server configured (Bitrix Push Server 2.0 or cloud)
- No legacy push server versions (0.3.x or 1.0) in use
✅ Web server and static files
- nginx (or Apache) serves static paths directly, bypassing PHP
Cache-Control: max-ageset for static assets- Gzip or Brotli compression enabled
- CDN in front of static assets (for distributed or international teams)
- Site-boost options (optimize load time + lazy image loading) enabled on public sites
✅ Hardware and OS
- Server RAM meets the sizing table for your user count
- DB volume is on SSD; portal files may be on HDD
- TCP socket reuse settings tuned for high-concurrency (
tcp_tw_reuse)
✅ Code and customisation
- Core file modification audit run (built-in Quality Monitor tool)
- Modified core files documented and planned for migration to custom modules
- All third-party Marketplace solutions updated to latest versions
When to Call in an Expert
If the checklist above does not resolve the slowdown, the bottleneck is almost always either a deep database query pattern from custom code or an architectural constraint - both require profiling tools and portal-specific knowledge to diagnose quickly.
Signs that a structured audit is worthwhile:
- Response time is above 2 seconds for standard CRM operations after basic tuning
- Slowness only appears under concurrent load (20+ simultaneous users), not in isolation
- Core files have been modified and cannot be cleanly updated
- The portal is approaching a user-count tier that requires a cluster topology
ACP Group, a Bitrix24 Gold partner with 1,300+ completed projects, offers performance audits that cover the full stack: hardware sizing, PHP/DB configuration, caching architecture, and custom-code profiling. The Self-Hosted Bitrix24 High Availability guide covers the cluster path for portals that have outgrown a single server.
For context on the broader decision between cloud and on-premise, see Self-Hosted vs Cloud Bitrix24: Complete 3-Year TCO Analysis and Self-Hosted Bitrix24 Security Hardening: 25-Point Checklist for the security side of the same stack.
Working with a partner on self-hosting. Want the control of self-hosted Bitrix24 without running the server yourself? ACP Group can deploy and operate it for you - see managed self-hosted Bitrix24, support & maintenance plans, or request a turnkey deployment quote.
Frequently asked questions
What PHP version does self-hosted Bitrix24 require in 2026?
PHP 8.2 is the enforced minimum as of 1 March 2024 - portals running older versions cannot receive platform updates. PHP 8.3 is the recommended version as of 2026. Always enable OPcache alongside the version upgrade for maximum performance gain.
How do I find the biggest performance bottleneck on my Bitrix24 portal?
Start with the built-in Performance panel at Settings → Performance - it shows cache hit rates and slow component timings. Then enable the MySQL slow query log (long_query_time = 1) and review it after a representative working session. Most slowdowns trace to OPcache being off, an undersized InnoDB buffer pool, or disabled managed cache.
Do I need a separate Push & Pull server for a self-hosted Bitrix24?
Yes. Since early 2021, the web messenger module requires a configured Push & Pull server. Without it, chats, task notifications, and telephony events fall back to HTTP polling, generating far more load on the database and PHP. Use Bitrix Push Server 2.0 - older versions (0.3.x and 1.0) are no longer supported.
What is the recommended innodb_buffer_pool_size for Bitrix24?
Set it to 60-70 % of the total RAM on your database server. On a 48 GB DB server, that means roughly 32-34 GB. The default value of 128 MB is suitable only for development and will cause severe I/O wait under any real concurrent load.
Can modified Bitrix24 core files cause performance problems?
Yes. Modified core files block platform updates, can introduce unpredictable execution paths, and prevent the OPcache from working optimally across update cycles. Use the built-in Quality Monitor to audit which files have been changed, then migrate that logic to proper custom modules.
When does a single-server Bitrix24 need to become a cluster?
As a rule of thumb, plan for a two-tier cluster (dedicated application servers + dedicated database servers) when you exceed 1,000 concurrent users or when single-server tuning no longer keeps response times below one second under peak load. Bitrix24 Enterprise load tests demonstrated stable sub-1-second responses for thousands of simultaneous sessions on a four-node cluster using mid-range hardware.
Based on real practice
This article is based on 15 internal documents from ACP Group's practice - work plans, specifications and Bitrix24 implementation cases.
Need help with Bitrix24?
ACP Group is a Bitrix24 Gold Partner. We'll review your task, estimate the effort in hours and propose a plan - free of charge.