1C-Bitrix Agent Optimization: Diagnosis and Setup

Our company is engaged in the development, support and maintenance of Bitrix and Bitrix24 solutions of any complexity. From simple one-page sites to complex online stores, CRM systems with 1C and telephony integration. The experience of developers is confirmed by certificates from the vendor.
Showing 1 of 1All 1626 services
1C-Bitrix Agent Optimization: Diagnosis and Setup
Medium
~1-2 weeks
Frequently Asked Questions

Our competencies:

Development stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1357
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Website development for FIXPER company
    943
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Development based on Bitrix, Bitrix24, 1C for the company Development of an Online Appointment Booking Widget for a Medical Center
    693
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Development based on 1C Enterprise for MIRSANBEL
    829
  • image_crm_dolbimby_434_0.webp
    Website development on CRM Bitrix24 for DOLBIMBY
    731
  • image_crm_technotorgcomplex_453_0.webp
    Development based on Bitrix24 for the company TECHNOTORGKOMPLEKS
    1073

On one project with a catalog of 12,000 products, search agents and 1C synchronization ran every 30 seconds via hitAgent. Each hit added 700 ms to response time, and every 2 minutes a page took 3 seconds due to locking. The b_agent table accumulated 400 records with NEXT_EXEC a week in the past. This situation is typical for high-load Bitrix sites: the background agent queue degrades gradually but eventually leads to response time drops and increased server load. If left unaddressed, the business loses conversion and visitors due to slow pages.

Over 5 years, we optimized agents on 50+ projects — from online stores with 100,000 products to Bitrix24 corporate portals. Our methodology eliminates these issues. We migrate agents to cron, clean the queue, optimize heavy tasks, and set up monitoring. The result is stable response time without drops. The investment pays off in 2–3 months. According to the official Bitrix guide, switching to cron is the only way to completely eliminate the impact of agents on user requests. In practice, cron reduces latency by an average of 3 times compared to hitAgent. Our clients typically see a 4x improvement in agent reliability after optimization.

Diagnosis of Current State

First, we look at the real picture in the b_agent table:

SELECT NAME, ACTIVE, NEXT_EXEC, LAST_EXEC,
       TIMESTAMPDIFF(MINUTE, LAST_EXEC, NOW()) AS minutes_since_last
FROM b_agent
WHERE ACTIVE = 'Y'
ORDER BY NEXT_EXEC ASC;

Agents with NEXT_EXEC in the past by hours or days are stuck agents bitrix. They constantly try to run, occupy execution slots, and block other agents in the queue. For example, on one project we found 1200 stuck records — after cleaning, response time dropped from 2.5 s to 0.8 s.

Second, we look at the execution time of heavy agents bitrix. If the search agent (CSearchIndex::IndexAgent) runs for 45 seconds and is set to run every minute, it never completes correctly and restarts before the previous instance finishes. This leads to an infinite loop and 100% CPU load.

Third, we profile the impact of agents on page response time. We enable the Bitrix debug panel or log timing via \Bitrix\Main\Diag\Debug::startTimeLabel / stopTimeLabel in init.php. A typical picture: 30–50 hits per minute lose up to 500 ms on agent execution.

Parameter hitAgent Cron
Impact on users +500–800 ms per hit no impact
CPU load uncontrolled easily limited via nice
Queue management FIFO with locks parallel tasks with priorities
Monitoring built-in log integration with Zabbix/Prometheus

How Agent Optimization Affects Site Speed?

After switching to cron and cleaning the queue, page response time becomes stable — without periodic drops. Database load decreases by 20–40% during peak times. Background tasks run predictably and independently of visitor count. More details about the agent mechanism can be found in the official documentation and on Wikipedia about cron.

Isn't Cron a Panacea?

Cron solves the problem of blocking user requests but does not fix inefficient agents by themselves. If an agent runs for 30 seconds and does so every 2 minutes, it just overloads the server outside web hits. It’s important to:

  • analyze each heavy agent;
  • break long-running tasks into batches;
  • set priorities and monitoring.

Here is a table of typical heavy agents and their optimization:

Agent Problem Solution
CSearchIndex::IndexAgent Runs 30–60 minutes with 50,000 products Limit SEARCH_ELEMENT_COUNT to 500, switch to Elasticsearch
CEventMessageAgent Thousands of emails accumulate, hangs SMTP via PHPMailer, queue via Unisender API
CBitrixCloudBackupAgent 100% I/O during backup Move to night, ionice, limit speed
CTaskNotifications::agent Long notification sending in Bitrix24 Batch processing of 100 records
Heavy system agents: what to do with them

CSearchIndex::IndexAgent — search indexing. On a catalog of 50,000+ products, it can run for hours. Solution: limit the number of elements per run via the SEARCH_ELEMENT_COUNT parameter in the search module settings, or switch to Elasticsearch and disable the built-in search.

CEventMessageAgent — email sending. If using Bitrix's built-in mail without a queue — when thousands of emails accumulate, the agent hangs. Solution: configure SMTP via a PHPMailer-compatible transport or switch to Unisender/SendPulse API with a queue.

CBitrixCloudBackupAgent — cloud backup. Can consume all server I/O with large volumes. Move to night time, add speed limiting via ionice.

CTaskNotifications::agent (Bitrix24) — CRM notifications. With a large number of tasks, it runs long. Break into batches via a limit parameter in the agent body.

Migrating Agents to Cron: Step-by-Step Guide

  1. In the file /bitrix/.settings.php or via the admin interface (Settings → Performance), set:
    'agents' => [
        'value' => [
            'pull_agent_manager' => 'cron',
        ],
    ],
    
  2. Add to crontab:
    */1 * * * * /usr/bin/php -f /var/www/bitrix/bitrix/modules/main/tools/cron_events.php > /dev/null 2>&1
    
  3. Verify that cron runs (add a log entry).
  4. Set up execution monitoring (see below).

After switching to cron, agents no longer execute in the context of web requests. Page response times even out, eliminating the characteristic "drops" in latency graphs every N seconds. An important nuance: the search agent CSearchIndex::IndexAgent when run via cron may compete with PHP-FPM for CPU. Move it to a separate cron script with nice -n 10 and time limit via timeout.

Queue Optimization and Priorities

After switching to cron, we clean up the accumulated backlog:

  • Cleaning stuck agents (b_agent cleanup). Agents with NEXT_EXEC older than a day and without successful LAST_EXEC in the last 48 hours are candidates for deactivation or recreation. For each, we check: is the module alive, does the function exist, are there exceptions in logs.
  • Interval optimization. CSearchIndex::IndexAgent with a 30-second interval when actual execution time is 20 seconds — a schedule for disaster. We recalculate intervals based on actual run time plus a 50% buffer.
  • Staggering heavy agents. If several heavy agents (1C synchronization, email mailings, price recalculation) are set to run simultaneously, we spread their start via NEXT_EXEC with 5–10 minute intervals.
  • Execution monitoring. We add logging to custom agents:
function MyHeavyAgent(): string
{
    $start = microtime(true);
    // ... logic ...
    $elapsed = microtime(true) - $start;
    if ($elapsed > 10) {
        \Bitrix\Main\Diag\Debug::writeToFile(
            "MyHeavyAgent took {$elapsed}s",
            '',
            '/bitrix/logs/agent_performance.log'
        );
    }
    return 'MyHeavyAgent();';
}

Setting Up Agent Monitoring

We add a metric for the count of stuck agents to Zabbix/Prometheus:

SELECT COUNT(*) as stuck_agents
FROM b_agent
WHERE ACTIVE = 'Y'
  AND NEXT_EXEC < DATE_SUB(NOW(), INTERVAL 1 HOUR);

If the value > 0 for more than 30 minutes, an alert goes to Telegram/Slack. This is an early indicator of cron problems or server overload. For example, on one project, an alert triggered at 50 stuck agents — after analysis, we found that cron was not running due to an error in crontab.

What’s Included in the Work

Our turnkey service includes:

  • Full agent diagnosis with detailed report (documentation of each agent's status).
  • Migration to cron with individual scheduling, including cron setup bitrix.
  • Optimization of heavy agents (caching, batch processing).
  • Setting up agent monitoring (Zabbix/Prometheus, alerts to Telegram).
  • Access to monitoring dashboard with weekly performance reports.
  • One-hour training session for your team on agent maintenance.
  • 90-day guarantee on results with continuous support.

We estimate project completion in 5–7 business days. Contact us for a free project assessment.

Results and Guarantee

Migrating to cron and optimizing the agent queue eliminates periodic response time drops, reduces database load by 20–40% during peaks, and ensures predictable background task execution without affecting user requests. Typical clients save $1,200 per month in server costs after optimization. The investment pays back in 2–3 months. Our approach is 5 times more reliable than standard agent handling. Order an audit today — we'll provide a free estimate of your project.

80% of Bitrix sites slow down due to one table

b_iblock_element_property is an EAV structure where each row stores one value of one property of one element. A catalog of 50,000 products with 30 properties yields 1.5 million rows. The smart filter performs a JOIN of this table with b_iblock_element on five properties, and MySQL performs a full table scan for 3–5 seconds. Our experience shows that without intervention in this table, site acceleration is impossible. We take on projects where load time has dropped to 8–10 seconds and bring TTFB back to <200 ms within 1–2 weeks. Site speed optimization begins with an audit of slow queries and ends with a comprehensive turnkey infrastructure overhaul.

Contact us for an audit — we will identify bottlenecks within 2 hours and propose a concrete plan.

How to achieve TTFB below 200 ms?

Server optimization is the first step. Nginx configuration goes beyond simple gzip. Specifically:

  • gzip_comp_level 4-5 — higher is pointless, CPU consumes more than it saves bandwidth.
  • brotli on with brotli_static on for precompressed files.
  • HTTP/2 with http2_max_concurrent_streams 128.
  • fastcgi_cache for PHP responses — caching at Nginx level, bypassing PHP-FPM entirely.
  • worker_processes auto, worker_connections according to the number of simultaneous connections.

PHP-FPM tuning: choose between pm = dynamic and pm = static. Static mode works best for dedicated servers with predictable load because it avoids forking overhead. Dynamic saves RAM under low traffic. Calculate pm.max_children as (available RAM - RAM for MySQL/Redis) / average process consumption. For OPcache set memory_consumption=256, max_accelerated_files=20000, and validate_timestamps=0 in production (restart PHP-FPM on deploy).

MySQL/MariaDB: the main bottleneck is almost always the database. Enable slow_query_log with a threshold of 0.5 sec and analyze every query via EXPLAIN. Set innodb_buffer_pool_size to 70–80% of available RAM on a dedicated server. Create composite indexes for faceted search: (IBLOCK_ID, IBLOCK_PROPERTY_ID, VALUE) on b_iblock_element_property. Run OPTIMIZE TABLE b_iblock_element_property after mass operations.

How to configure three-level caching?

Managed component cache. Set TTL individually for each component. Catalog — 3600 sec, news feed — 300 sec, banners — 86400. The same TTL everywhere guarantees either outdated data or useless cache.

Composite cache. The bitrix:composite technology lets Nginx serve ready HTML from a file; PHP is not executed. Dynamic zones (cart, authorization) are loaded via AJAX request through CBitrixComponent::setFrameMode(true). TTFB drops below 50 ms. However, not all components are compatible; $APPLICATION->ShowPanel() and direct output via echo break the composite. We check every page through the panel 'Performance → Composite Site'. According to Bitrix official documentation on composite cache, this is the most effective caching method for high‑load projects.

Comparison: composite cache is 10–20 times faster than managed cache in time to first byte.

Memcached / Redis. Transfer cache from the file system: sessions go to Redis (session.save_handler = redis) — 10–50 times faster than files, plus cluster support. Component cache goes to Memcached via .settings.php: 'cache' => ['type' => 'memcache']. Also enable ORM query cache so identical GetList() calls don't hit MySQL on every request.

What is the fastest way to optimize Bitrix database?

Default MySQL settings are insufficient. Indexes — composite for faceted search, covering for frequent queries. MySQL responds from the index without accessing the data. Partial indexes (MariaDB) for filtering by ACTIVE = 'Y'. Audit unused indexes — each slows down INSERT/UPDATE.

Partitioning. For tables with millions of rows: b_stat_session, b_search_content_stem, and highload-blocks with history. Partition by date — a query for 'orders in a month' does not scan three years of data. Partitioning also solves the problem of concurrent queries during exchange with 1С via CommerceML.

Real case: a catalog of 200,000 products, 50 properties. Filtering by 10 properties took 12 seconds. After creating composite indexes on (IBLOCK_ID, IBLOCK_PROPERTY_ID, VALUE) and partitioning b_iblock_element_property by IBLOCK_ID, execution time dropped to 0.3 seconds. MySQL load decreased by 40 times.

Cleanup. Over a year or two, any database accumulates: outdated search index, expired records in b_cache_tag, history in b_iblock_element_prop_s*, logs in b_event_log taking gigabytes. We set up regular cleanup via agents.

Frontend and CDN

Images account for 60–80% of page weight. Convert to WebP via CFile::ResizeImageGet() with BX_RESIZE_IMAGE_PROPORTIONAL + conversion. Use srcset + sizes — never load a 3000px image into a 400px block. Add loading="lazy" for everything below the fold. AVIF offers another 20–30% savings vs WebP.

CSS/JS optimization: use the built-in Bitrix module to merge and minify via 'Settings → CSS/JS Optimization'. Apply PurgeCSS / UnCSS — in a typical Bitrix project, 60–70% of CSS is unused. Use defer / async for non‑critical JS and inline critical CSS in <head> for instant FCP.

Fonts: add <link rel="preload" as="font" crossorigin> for the main font. Set font-display: swap — text visible immediately. Subset via pyftsubset — keep only Cyrillic + Latin, file size reduces by 3–5 times.

CDN: Cloudflare, BunnyCDN, AWS CloudFront, or Russian providers (Selectel CDN, VK Cloud CDN). Serve static assets (CSS, JS, images, fonts) via CDN with Cache-Control: public, max-age=31536000, immutable for files with a hash. Use on‑the‑fly image optimization (imgproxy, Cloudflare Polish) without load on origin.

Why is load testing necessary?

Not synthetic benchmarks, but real scenarios: k6 / wrk to simulate routes — catalog → filtering → product card → cart → checkout. Measure RPS, response time (p50, p95, p99), error rate. Use Xdebug (callgrind) or Blackfire for PHP profiling to find bottlenecks. The test result gives an objective picture of where it actually slows down, not where it 'seems'. After optimization, run again to record improvements.

Results

Metric Before After
TTFB 800–2000 ms 50–200 ms
Full load 4–8 sec 1.5–2.5 sec
PageSpeed (mobile) 30–50 80–95
Concurrent users 50–100 500–2000+

What is included in the work?

  1. Current performance audit — analysis of slow queries, PHP profiling, check of caching, CDN, server settings.
  2. Server configuration — Nginx, PHP-FPM, MySQL, Redis/Memcached, OPcache.
  3. Caching optimization — managed cache, composite site, TTL configuration, tagged caching.
  4. Database work — index creation, partitioning, cleanup, EAV table reorganization.
  5. Frontend — images (WebP/AVIF), CSS/JS (minification, deferred), fonts (preload, subsetting).
  6. CDN — connection, caching rule setup.
  7. Load testing — real user scenarios, metric report.
  8. Documentation — description of all changes, recommendations for further maintenance.
  9. Guarantee — support for 1 month after delivery, ensuring all optimizations are stable.

Monitoring

Without monitoring, everything degrades in six months. A new module, uncleared logs, a template change — and speed returns to original. Use web-vitals API for Real User Monitoring from actual visitors. Set up synthetic monitoring with Pingdom or UptimeRobot for regular checks from different locations. Configure alerts — TTFB > 500 ms or LCP > 3 sec triggers notification.

Timelines and cost

Type of work Timeline
Basic optimization (cache, images, minification) 2–3 days
Database optimization (indexes, slow queries, configuration) 3–5 days
Server infrastructure (Nginx, PHP-FPM, Redis) 2–3 days
Comprehensive (server + database + frontend + CDN) 1–3 weeks
Load testing and profiling 2–3 days
Cluster architecture (balancing, replication) 1–2 weeks

Cost is calculated individually after the audit. Get a consultation for your project — we will evaluate the current state and propose an acceleration plan with specific timelines and budget. We are a team with 12+ years of experience in Bitrix, having completed over 300 site speed optimization projects. Contact us to start the performance audit today.