> For the complete documentation index, see [llms.txt](https://docs.iexexchanger.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.iexexchanger.com/server-i-dannye/proizvoditelnost.md).

# Производительность

Данная инструкция содержит рекомендации по настройке PHP 8.4 и PostgreSQL 18 для повышения производительности iEXExchanger.

Настройки предназначены для проектов, работающих на FastPanel. Готовые профили позволяют подобрать значения по мощности сервера без ручного расчёта каждого параметра.

{% hint style="warning" %}
Не выбирайте профиль выше фактических характеристик сервера. Завышенные значения могут привести к нехватке оперативной памяти и нестабильной работе PHP-FPM или PostgreSQL.
{% endhint %}

## Где находятся настройки

{% stepper %}
{% step %}

### Настройки PHP

Откройте FastPanel: **«Управление» — «PHP»**

<figure><img src="/files/EG6rle6xFCnAjeRfu7b1" alt=""><figcaption></figcaption></figure>

Выберите используемую версию:

```
PHP 8.4
```

Затем откройте настройки переменных PHP.

<figure><img src="/files/ChxKqgZdpsjS23cf66AE" alt=""><figcaption></figcaption></figure>

Параметры также можно изменить отдельно для Backend-сайта. Для этого откройте карточку:

```
app.ВАШ_ДОМЕН
```

Перейдите в раздел **«Настройки PHP»**.
{% endstep %}

{% step %}

### Настройки PostgreSQL

Откройте FastPanel: **«Настройки» — «Базы данных»**

<figure><img src="/files/vTHhQq0B29rhullxM87I" alt=""><figcaption></figcaption></figure>

Затем перейдите в **«Серверы баз данных»**.

Выберите локальный сервер:

```
PostgreSQL 18 local
```

Нажмите **«Настроить переменные»**.

Изменение переменных через FastPanel доступно только для локального сервера PostgreSQL. Для внешнего сервера параметры настраиваются непосредственно на сервере базы данных.
{% endstep %}
{% endstepper %}

***

## Как выбрать профиль

| Профиль                         | Характеристики сервера   |
| ------------------------------- | ------------------------ |
| Минимальный                     | 2 vCPU, 4 ГБ ОЗУ         |
| Рекомендуемый                   | 4 vCPU, 8 ГБ ОЗУ         |
| Высокая производительность      | 8 vCPU, 16 ГБ ОЗУ        |
| Максимальная производительность | от 16 vCPU, от 32 ГБ ОЗУ |

Если сервер имеет промежуточный объём памяти, используйте ближайший меньший профиль.

Например, для сервера с 12 ГБ ОЗУ сначала используйте профиль на 8 ГБ. После проверки работы отдельные параметры можно увеличить.

## Профиль «Минимальный»

Подходит для:

* тестовых проектов;
* небольших обменников;
* проектов с низкой нагрузкой;
* серверов без большого количества заявок и посетителей.

{% stepper %}
{% step %}

### Сервер

```
2 vCPU
4 ГБ ОЗУ
40 ГБ NVMe SSD
PHP 8.4
PostgreSQL 18
```

Сервер с 4 ГБ ОЗУ рекомендуется использовать только для тестирования или небольшой нагрузки.
{% endstep %}

{% step %}

### PHP 8.4

```ini
memory_limit=512M

post_max_size=220M
upload_max_filesize=200M

max_execution_time=60
max_input_time=60

max_input_vars=10000

realpath_cache_size=4096K
realpath_cache_ttl=600

opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.max_wasted_percentage=10
opcache.save_comments=1

opcache.validate_timestamps=1
opcache.revalidate_freq=2

opcache.jit=off
opcache.jit_buffer_size=0
```

{% endstep %}

{% step %}

### PostgreSQL 18

```conf
shared_buffers = '512MB'
effective_cache_size = '1536MB'

work_mem = '4MB'
maintenance_work_mem = '128MB'
autovacuum_work_mem = '64MB'

max_connections = 50

min_wal_size = '512MB'
max_wal_size = '2GB'

checkpoint_completion_target = 0.9
wal_compression = on

autovacuum = on
```

{% endstep %}
{% endstepper %}

## Профиль «Рекомендуемый»

Подходит большинству проектов iEXExchanger.

Профиль обеспечивает нормальный запас ресурсов для PHP, PostgreSQL и операционной системы без чрезмерного потребления памяти.

{% stepper %}
{% step %}

### Сервер

```
4 vCPU
8 ГБ ОЗУ
80 ГБ NVMe SSD
PHP 8.4
PostgreSQL 18
```

{% endstep %}

{% step %}

### PHP 8.4

```ini
memory_limit=768M

post_max_size=220M
upload_max_filesize=200M

max_execution_time=120
max_input_time=120

max_input_vars=20000

realpath_cache_size=8192K
realpath_cache_ttl=600

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=32
opcache.max_accelerated_files=50000
opcache.max_wasted_percentage=10
opcache.save_comments=1

opcache.validate_timestamps=1
opcache.revalidate_freq=2

opcache.jit=off
opcache.jit_buffer_size=0
```

{% endstep %}

{% step %}

### PostgreSQL 18

```conf
shared_buffers = '1GB'
effective_cache_size = '3GB'

work_mem = '4MB'
maintenance_work_mem = '256MB'
autovacuum_work_mem = '128MB'

max_connections = 75

min_wal_size = '1GB'
max_wal_size = '4GB'

checkpoint_completion_target = 0.9
wal_compression = on

autovacuum = on
```

{% endstep %}
{% endstepper %}

## Профиль «Высокая производительность»

Подходит для:

* крупных обменников;
* большого количества направлений;
* активной работы административной панели;
* большого количества одновременных заявок;
* высокой нагрузки на API и базу данных.

{% stepper %}
{% step %}

### Сервер

```
8 vCPU
16 ГБ ОЗУ
160 ГБ NVMe SSD
PHP 8.4
PostgreSQL 18
```

{% endstep %}

{% step %}

### PHP 8.4

```ini
memory_limit=1024M

post_max_size=520M
upload_max_filesize=500M

max_execution_time=180
max_input_time=180

max_input_vars=30000

realpath_cache_size=16384K
realpath_cache_ttl=600

opcache.enable=1
opcache.memory_consumption=512
opcache.interned_strings_buffer=64
opcache.max_accelerated_files=100000
opcache.max_wasted_percentage=10
opcache.save_comments=1

opcache.validate_timestamps=1
opcache.revalidate_freq=2

opcache.jit=off
opcache.jit_buffer_size=0
```

{% endstep %}

{% step %}

### PostgreSQL 18

```
shared_buffers = '3GB'
effective_cache_size = '8GB'

work_mem = '8MB'
maintenance_work_mem = '512MB'
autovacuum_work_mem = '256MB'

max_connections = 100

min_wal_size = '1GB'
max_wal_size = '8GB'

checkpoint_completion_target = 0.9
wal_compression = on

autovacuum = on
```

{% endstep %}
{% endstepper %}

## Профиль «Максимальная производительность»

Подходит для проектов с очень высокой нагрузкой.

Используйте этот профиль только на сервере с достаточным количеством оперативной памяти, производительным процессором и Enterprise NVMe.

{% stepper %}
{% step %}

### Сервер

```
16+ vCPU
32+ ГБ ОЗУ
Enterprise NVMe SSD
PHP 8.4
PostgreSQL 18
```

{% endstep %}

{% step %}

### PHP 8.4

```ini
memory_limit=1536M

post_max_size=1050M
upload_max_filesize=1000M

max_execution_time=300
max_input_time=300

max_input_vars=50000

realpath_cache_size=32768K
realpath_cache_ttl=600

opcache.enable=1
opcache.memory_consumption=512
opcache.interned_strings_buffer=64
opcache.max_accelerated_files=100000
opcache.max_wasted_percentage=10
opcache.save_comments=1

opcache.validate_timestamps=1
opcache.revalidate_freq=2

opcache.jit=off
opcache.jit_buffer_size=0
```

{% endstep %}

{% step %}

### PostgreSQL 18

```conf
shared_buffers = '6GB'
effective_cache_size = '18GB'

work_mem = '16MB'
maintenance_work_mem = '1GB'
autovacuum_work_mem = '512MB'

max_connections = 150

min_wal_size = '2GB'
max_wal_size = '12GB'

checkpoint_completion_target = 0.9
wal_compression = on

autovacuum = on
```

{% endstep %}
{% endstepper %}

***

## Что означают настройки PHP

### memory\_limit

Ограничивает максимальную память одного PHP-скрипта.

Пример:

```ini
memory_limit=768M
```

Параметр не ускоряет PHP напрямую. Он разрешает выполнять операции, которым требуется больше памяти.

Не используйте на рабочем сервере:

```ini
memory_limit=-1
```

PHP должен иметь ограничение памяти.

### post\_max\_size

Ограничивает общий размер POST-запроса.

Значение должно быть больше `upload_max_filesize`.

Пример:

```ini
post_max_size=220M
upload_max_filesize=200M
```

### upload\_max\_filesize

Ограничивает размер одного загружаемого файла.

Увеличение параметра не повышает производительность. Используйте значение, которое действительно требуется для загрузки файлов через панель управления.

### max\_execution\_time

Ограничивает время выполнения одного веб-запроса.

Пример:

```ini
max_execution_time=120
```

Увеличение параметра не делает запрос быстрее. Оно только разрешает ему выполняться дольше.

### max\_input\_vars

Определяет максимальное количество переменных, которые PHP может принять из формы.

Для административной панели рекомендуется значение от:

```
10000
```

до:

```
50000
```

в зависимости от выбранного профиля.

### realpath\_cache\_size

Хранит результаты определения путей к PHP-файлам.

iEXExchanger использует большое количество PHP-классов, поэтому realpath-кеш уменьшает количество повторных обращений к файловой системе.

### opcache.memory\_consumption

Определяет объём оперативной памяти для хранения скомпилированного PHP-кода.

Пример:

```ini
opcache.memory_consumption=256
```

Память OPcache не нужно увеличивать вместе с `memory_limit`. Если весь PHP-код помещается в кеш, дальнейшее увеличение не даст заметного ускорения.

### opcache.max\_accelerated\_files

Определяет максимальное количество PHP-файлов, которые могут находиться в OPcache.

Для большинства проектов достаточно:

```ini
opcache.max_accelerated_files=50000
```

Для крупного проекта:

```ini
opcache.max_accelerated_files=100000
```

## Режимы OPcache

{% stepper %}
{% step %}

### Безопасный режим

Во всех основных профилях используется:

```ini
opcache.validate_timestamps=1
opcache.revalidate_freq=2
```

PHP проверяет изменения файлов каждые две секунды. После обновления новая версия кода начинает использоваться автоматически.

Этот режим рекомендуется большинству клиентов.
{% endstep %}

{% step %}

### Максимальная производительность

Если после каждого обновления гарантированно перезапускается PHP-FPM, можно использовать:

```ini
opcache.validate_timestamps=0
opcache.revalidate_freq=0
```

PHP перестанет проверять изменения файлов при обработке запросов.

{% hint style="warning" %}
При отключённой проверке файлов после каждого обновления обязательно перезапускайте PHP-FPM. Иначе сервер может продолжить выполнять предыдущую версию PHP-кода.
{% endhint %}
{% endstep %}

{% step %}

### JIT

Для обычной работы iEXExchanger рекомендуется оставить JIT выключенным:

```ini
opcache.jit=off
opcache.jit_buffer_size=0
```

Включение JIT не гарантирует ускорение Laravel-приложения и дополнительно использует оперативную память.
{% endstep %}
{% endstepper %}

## Что означают настройки PostgreSQL

### shared\_buffers

Определяет объём памяти собственного кеша PostgreSQL.

Пример:

```conf
shared_buffers = '1GB'
```

Чем больше данных находится в кеше, тем реже PostgreSQL обращается к диску.

Передавать PostgreSQL большую часть оперативной памяти не нужно. База также использует файловый кеш операционной системы.

### effective\_cache\_size

Сообщает планировщику PostgreSQL, какой объём кеша предположительно доступен.

Пример:

```conf
effective_cache_size = '3GB'
```

Параметр не резервирует указанный объём памяти. Он влияет только на выбор плана выполнения запросов.

### work\_mem

Ограничивает память одной операции сортировки или хеширования.

Пример:

```conf
work_mem = '8MB'
```

Один запрос может одновременно выполнять несколько таких операций. Несколько подключений также могут использовать `work_mem` одновременно.

Не устанавливайте глобально:

```conf
work_mem = '128MB'
```

без предварительного расчёта.

### maintenance\_work\_mem

Используется при:

* создании индексов;
* выполнении `VACUUM`;
* добавлении внешних ключей;
* обслуживании таблиц.

Пример:

```conf
maintenance_work_mem = '512MB'
```

### autovacuum\_work\_mem

Ограничивает память одного процесса autovacuum.

Пример:

```conf
autovacuum_work_mem = '256MB'
```

Если одновременно работают несколько процессов autovacuum, каждый из них может использовать память отдельно.

### max\_connections

Ограничивает количество одновременных подключений к PostgreSQL.

Пример:

```conf
max_connections = 100
```

Большое значение не ускоряет базу. Каждое подключение использует оперативную память, поэтому лимит должен соответствовать мощности сервера.

### min\_wal\_size и max\_wal\_size

Определяют объём журнала WAL, который PostgreSQL хранит и использует между контрольными точками.

Пример:

```conf
min_wal_size = '1GB'
max_wal_size = '4GB'
```

Увеличение `max_wal_size` помогает распределить дисковую нагрузку, но требует свободного места на диске.

### checkpoint\_completion\_target

Значение:

```conf
checkpoint_completion_target = 0.9
```

распределяет запись контрольной точки по большей части доступного интервала и уменьшает резкие пики дисковой нагрузки.

### wal\_compression

Значение:

```conf
wal_compression = on
```

уменьшает объём части данных, записываемых в WAL. Это снижает дисковую нагрузку, но немного увеличивает использование процессора.

## Обязательные параметры PostgreSQL

Следующие параметры должны оставаться включёнными:

```conf
fsync = on
full_page_writes = on
synchronous_commit = on
autovacuum = on
```

Не отключайте их ради дополнительной скорости.

{% hint style="danger" %}
Отключение `fsync`, `full_page_writes` или `synchronous_commit` может привести к потере подтверждённых данных после сбоя сервера.
{% endhint %}

## Нужно ли переводить значения в байты

PostgreSQL принимает значения с единицами измерения:

```
512MB
1GB
8GB
```

Используйте значения в том виде, в котором они указаны в профилях.

Переводить их в байты не требуется.

## Если FastPanel не позволяет сохранить переменные

Если при сохранении появляется ошибка прав, служебной роли FastPanel нужно разрешить изменение выбранных параметров.

Подключитесь к серверу по SSH и выполните:

{% content-ref url="/spaces/uyjsNtEAtO6Sby8CHWyD/pages/cCEoFDjTDIufy3NUEakd" %}
[Подключение к серверу по SSH](/help-center/upravlenie-serverom/podklyuchenie-k-serveru-po-ssh.md)
{% endcontent-ref %}

```bash
sudo -u postgres psql -X -d postgres <<'SQL'
GRANT pg_read_all_settings TO fastuser;

GRANT ALTER SYSTEM ON PARAMETER
    shared_buffers,
    effective_cache_size,
    work_mem,
    maintenance_work_mem,
    autovacuum_work_mem,
    max_connections,
    min_wal_size,
    max_wal_size,
    checkpoint_completion_target,
    wal_compression,
    autovacuum
TO fastuser;

GRANT EXECUTE
ON FUNCTION pg_catalog.pg_reload_conf()
TO fastuser;
SQL
```

Роль `fastuser` используется только для подключения FastPanel к PostgreSQL.

{% hint style="warning" %}
Не назначайте `fastuser` суперпользователем и не используйте эту роль для подключения iEXExchanger к базе данных.
{% endhint %}

## Как применить настройки PHP

После изменения параметров нажмите **«Сохранить»**.

Затем откройте: **«Настройки» — «Сервисы»**

Найдите PHP-FPM 8.4 и выполните перезапуск.

После этого новые параметры начнут использоваться сайтом.

## Как применить настройки PostgreSQL

После сохранения переменных проверьте, требуется ли перезапуск:

```bash
sudo -u postgres psql -X -d postgres -c "
SELECT
    name,
    setting,
    pending_restart
FROM pg_settings
WHERE pending_restart = true
ORDER BY name;
"
```

Параметры `shared_buffers` и `max_connections` требуют полного перезапуска PostgreSQL.

Выполните:

```bash
pg_ctlcluster 18 main restart
```

Проверьте доступность:

```bash
pg_isready -h 127.0.0.1 -p 5432
```

Ожидаемый результат:

```
127.0.0.1:5432 - accepting connections
```

## Проверка настроек PHP

Проверьте основные значения:

```bash
/opt/php84/bin/php -i | grep -E \
'memory_limit|post_max_size|upload_max_filesize|max_execution_time|realpath_cache|opcache.memory_consumption'
```

Если параметры настроены отдельно для Backend-сайта, значения PHP-FPM могут отличаться от настроек PHP в командной строке.

## Проверка настроек PostgreSQL

Выполните:

```bash
sudo -u postgres psql -X -d postgres -P pager=off -c "
SELECT
    name,
    setting,
    unit,
    source,
    pending_restart
FROM pg_settings
WHERE name IN (
    'shared_buffers',
    'effective_cache_size',
    'work_mem',
    'maintenance_work_mem',
    'autovacuum_work_mem',
    'max_connections',
    'min_wal_size',
    'max_wal_size',
    'checkpoint_completion_target',
    'wal_compression',
    'autovacuum'
)
ORDER BY name;
"
```

После перезапуска в поле `pending_restart` должно отображаться:

```
false
```

## Частые ошибки

<details>

<summary>Сайт показывает 502 после изменения PHP</summary>

**Почему возникает**

PHP-FPM не запустился или указано недопустимое значение.

**Что проверить**

Откройте:

**«Настройки» — «Сервисы»**

Проверьте состояние PHP-FPM 8.4.

**Как исправить**

Верните предыдущее значение и повторно запустите PHP-FPM.

</details>

<details>

<summary>PHP не принимает большой файл</summary>

**Почему возникает**

`post_max_size` меньше `upload_max_filesize`.

**Как исправить**

Например, для файла до 200 МБ используйте:

```ini
post_max_size=220M
upload_max_filesize=200M
```

</details>

<details>

<summary>Изменения PHP не применились</summary>

**Почему возникает**

Не был перезапущен PHP-FPM или изменения внесены для другой версии PHP.

**Как исправить**

Проверьте, что Backend использует PHP 8.4, и перезапустите PHP-FPM 8.4.

</details>

<details>

<summary>Изменения кода не отображаются</summary>

**Почему возникает**

Отключена проверка изменений файлов:

```ini
opcache.validate_timestamps=0
```

**Как исправить**

Перезапустите PHP-FPM.

</details>

<details>

<summary>Настройка PostgreSQL сохранилась, но не применилась</summary>

**Почему возникает**

Параметр требует перезапуска PostgreSQL.

**Как исправить**

Выполните:

```bash
pg_ctlcluster 18 main restart
```

</details>

<details>

<summary>PostgreSQL не запускается</summary>

**Почему возникает**

Указано недопустимое значение или выбран слишком высокий профиль.

**Что проверить**

```bash
systemctl status postgresql@18-main --no-pager
```

Проверьте журнал:

```bash
journalctl -u postgresql@18-main -n 100 --no-pager
```

**Как исправить**

Верните значения предыдущего профиля и повторно запустите PostgreSQL.

</details>

<details>

<summary>Серверу не хватает оперативной памяти</summary>

**Почему возникает**

Выбран профиль выше характеристик сервера или завышены `work_mem`, `shared_buffers` и `max_connections`.

**Что проверить**

```bash
free -h
```

**Как исправить**

Перейдите на предыдущий профиль. В первую очередь уменьшите `work_mem`, `shared_buffers` и `max_connections`.

</details>

## Частые вопросы

<details>

<summary>Какой профиль выбрать для сервера с 12 ГБ ОЗУ?</summary>

Сначала используйте профиль **«Рекомендуемый»** для 8 ГБ.

После проверки можно изменить PostgreSQL:

```conf
shared_buffers = '2GB'
effective_cache_size = '6GB'

work_mem = '8MB'
maintenance_work_mem = '512MB'
autovacuum_work_mem = '256MB'

max_connections = 100

min_wal_size = '1GB'
max_wal_size = '6GB'
```

</details>

<details>

<summary>Чем больше memory_limit, тем быстрее работает PHP?</summary>

Нет. Параметр только разрешает одному скрипту использовать больше памяти.

</details>

<details>

<summary>Нужно ли устанавливать upload_max_filesize равным 1 ГБ?</summary>

Только если через панель действительно загружаются такие файлы. Этот параметр не влияет на скорость работы сайта.

</details>

<details>

<summary>Можно ли установить max_connections равным 1000?</summary>

Технически можно, но это не ускорит PostgreSQL. Большое количество подключений увеличивает потребление памяти и может снизить производительность.

</details>

<details>

<summary>Можно ли использовать максимальный профиль на сервере с 16 ГБ?</summary>

Нет. Используйте профиль **«Высокая производительность»**.

</details>

<details>

<summary>Нужно ли включать JIT?</summary>

Для обычной работы iEXExchanger рекомендуется оставить JIT выключенным:

```ini
opcache.jit=off
opcache.jit_buffer_size=0
```

</details>

<details>

<summary>Нужно ли отключать autovacuum?</summary>

Нет. Autovacuum необходим для очистки устаревших версий строк и обновления статистики PostgreSQL.

</details>

<details>

<summary></summary>

</details>

***

## Рекомендуемый профиль для большинства клиентов

Для большинства проектов iEXExchanger рекомендуется следующая конфигурация.

{% stepper %}
{% step %}

### Сервер

```
4 vCPU
8 ГБ ОЗУ
80 ГБ NVMe SSD
PHP 8.4
PostgreSQL 18
```

{% endstep %}

{% step %}

### PHP 8.4

```ini
memory_limit=768M

post_max_size=220M
upload_max_filesize=200M

max_execution_time=120
max_input_time=120

max_input_vars=20000

realpath_cache_size=8192K
realpath_cache_ttl=600

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=32
opcache.max_accelerated_files=50000
opcache.max_wasted_percentage=10
opcache.save_comments=1

opcache.validate_timestamps=1
opcache.revalidate_freq=2

opcache.jit=off
opcache.jit_buffer_size=0
```

{% endstep %}

{% step %}

### PostgreSQL 18

```conf
shared_buffers = '1GB'
effective_cache_size = '3GB'

work_mem = '4MB'
maintenance_work_mem = '256MB'
autovacuum_work_mem = '128MB'

max_connections = 75

min_wal_size = '1GB'
max_wal_size = '4GB'

checkpoint_completion_target = 0.9
wal_compression = on

autovacuum = on
```

{% endstep %}
{% endstepper %}

Этот профиль обеспечивает сбалансированную работу PHP и PostgreSQL без чрезмерного потребления оперативной памяти.

## Коротко

Выберите профиль по фактическому объёму ОЗУ сервера.

Настройки PHP отвечают за допустимую память, загрузку файлов, время выполнения и кеширование PHP-кода. Настройки PostgreSQL управляют памятью базы, подключениями и журналом WAL.

После сохранения параметров перезапустите PHP-FPM и PostgreSQL. Не устанавливайте максимальный профиль на слабом сервере и не отключайте параметры надёжности PostgreSQL.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.iexexchanger.com/server-i-dannye/proizvoditelnost.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
