- Кэш записи ядра и параметры vm.dirty_* оказывают решающее влияние на воспринимаемую скорость копирования в Linux.
- Настройка параметров памяти и использование предварительного сжатия сокращают время копирования больших файлов на медленных дисках.
- Команда SCP позволяет осуществлять безопасную и эффективную передачу данных, используя такие параметры, как -C, -lo и -P, для оптимизации производительности и управления пропускной способностью.
- Возможность выбора между SCP и SFTP, а также сочетание консольных и графических инструментов обеспечивает гибкость для быстрого перемещения файлов в различных средах.
Если вы ежедневно используете Linux, вы, вероятно, сталкивались с разочарованием, когда во время копирования больших файлов на USB-накопитель, другой сервер по сети или между внутренними дисками отображается бесконечно медленная полоса прогресса. При этом на том же оборудовании вы загружаете Windows, и всё работает со скоростью 60-80 МБ/с. Это раздражает и создаёт впечатление, что Linux "медленно" перемещает данные.
В действительности все гораздо сложнее: система работает по-другому, ядро использует агрессивные кэши записи, существуют консервативные настройки по умолчанию , а также тип файловой системы, метод копирования и даже шифрование соединения. Понимание того, что происходит «под капотом», позволяет точно настроить систему и добиться производительности, значительно приближенной к той, которую вы наблюдаете на других системах.
Почему копирование файлов в Linux происходит так медленно?
Одна из самых распространенных жалоб — огромная разница в скорости копирования больших объемов данных (или даже терабайтов) на внешний USB-накопитель в Linux и Windows . Некоторые пользователи приводят реальные примеры: в Windows тот же внешний накопитель обеспечивает стабильную скорость 60-80 МБ/с, в то время как в Linux копирование начинается быстро, но затем скорость быстро падает до 2-10 МБ/с, из-за чего передача нескольких терабайт занимает не часы, а дни.
В других сценариях, например, при передаче видеоколлекции размером 1-3 ГБ между двумя серверами Linux, скорость rsync составляет около 20 МБ/с по сравнению со 100 МБ/с при использовании Samba с машины Windows в качестве посредника. На первый взгляд, это кажется нелогичным: rsync эффективен, использует SSH и теоретически должен быть самым быстрым вариантом.
Всё это создаёт впечатление, что существует постоянная ошибка ядра, делающая невозможным использование Linux для больших резервных копий. В действительности же такие ситуации вызваны сочетанием факторов: кэшированием записи, параметрами подсистемы памяти, характеристиками USB, типом файловой системы и используемыми инструментами . Тонкая настройка каждого компонента позволяет значительно повысить производительность.
Кроме того, крайне важно понимать, что в Linux скорость, отображаемая в диалоговом окне копирования или на индикаторе выполнения, не всегда соответствует тому, что происходит на диске на самом деле. Сначала данные копируются в оперативную память, а затем передаются на устройство порциями , вызывая скачки, паузы и это неприятное ощущение «зависания».

Кэш записи ядра: истинный виновник.
В Linux для буферизации операций с диском активно используется оперативная память. При копировании данных на медленный накопитель, например, USB-жесткий диск или флешку , система не сразу записывает все данные на устройство. Сначала она сохраняет их в кэше (неактивной памяти), а при выполнении определенных условий начинает запись данных в фоновом режиме.
Это создает обманчивый эффект: копирование начинается на полной скорости, индикатор выполнения поднимается очень быстро, а затем внезапно графический интерфейс, кажется, зависает на несколько минут. В действительности же кэш заполнился, и теперь ядро периодически освобождает эту память для USB-устройства , одновременно пытаясь сохранить работоспособность компьютера для других задач.
Если вы используете монитор диска (например, виджеты KDE Plasma), вы отчетливо увидите это поведение: очень высокие пики записи, за которыми следуют «пустые» промежутки, где почти ничего не записывается . Именно эти промежутки между всплесками приводят к длительному времени ожидания и ощущению общей вялости.
Кроме того, это связано с ещё одной распространённой проблемой: когда вы заканчиваете копирование и хотите «безопасно извлечь» USB-накопитель, система сообщает вам, что нужно подождать, поскольку данные всё ещё записываются. Это не ошибка; это означает, что часть содержимого всё ещё находится в кэше и ещё не была физически передана на устройство . Если вы отключитесь в этот момент, вы рискуете повредить файлы.
Один из ключевых моментов ускорения передачи данных — сокращение ненужных промежутков между всплесками записи и обеспечение более непрерывной и предсказуемой очистки кэша ядром до его заполнения . Здесь вступают в игру несколько параметров подсистемы виртуальной памяти.
Настройте параметр vm.dirty_* и другие параметры для медленных USB-накопителей.
При копировании на USB-накопитель, особенно если он отформатирован в NTFS или FAT, понимание некоторых параметров ядра и знание того, как включить кэширование записи на внешних накопителях, может существенно повлиять на ситуацию. Два очень важных параметра — `vm.dirty_bytes` и `vm.dirty_background_bytes` — определяют, насколько большим может стать кэш записи, прежде чем система начнет записывать данные на диск.
Используя такие команды, как:
echo $((120*1024*1024)) > /proc/sys/vm/dirty_bytes
echo $((60*1024*1024)) > /proc/sys/vm/dirty_background_bytes
Мы сообщаем ядру, что когда объем данных, ожидающих записи, достигает этих размеров (например, 120 МБ и 60 МБ), оно не должно ждать насыщения памяти и должно начать передачу раньше . Это уменьшает промежутки между всплесками, наблюдаемыми в мониторе диска, и делает передачу более плавной.
Эта корректировка особенно заметна на USB-накопителях, отформатированных в NTFS, хотя это и не панацея: физические ограничения устройства по-прежнему сохраняются . Однако она предотвращает циклы быстрой загрузки и остановки, которые ухудшают пользовательский опыт и искажают статистику скорости.
Для дисков с собственными файловыми системами Linux, такими как EXT4, можно пойти дальше и настроить время активации процесса записи, определяемое параметрами `vm.dirty_writeback_centisecs` и `vm.dirty_expire_centisecs` . По умолчанию эти значения обычно предназначены для предотвращения влияния на систему, но их можно изменить.
Например:
sysctl -w vm.dirty_writeback_centisecs=30
sysctl -w vm.dirty_expire_centisecs=500
Это снижает частоту активной очистки ядром кэша "грязных" данных на диск, что еще больше сокращает разрыв между всплесками записи . На практике это приводит к более полному и менее прерывистому отображению графика ввода-вывода, а также к более быстрому завершению операций копирования больших объемов данных.
Если вы хотите, чтобы эти изменения были постоянными и не были потеряны при перезапуске, вы можете добавить их в файл. /etc/sysctl.conf записи, такие как:
vm.dirty_bytes=125829120
vm.dirty_background_bytes=62914560
vm.dirty_writeback_centisecs=30
vm.dirty_expire_centisecs=500
Таким образом, ваша система всегда будет запускаться с более агрессивными параметрами записи, что на машинах, которые часто копируют данные на USB-накопители или медленные диски, значительно снижает уровень разочарования.

Влияние улучшений ядра на операции ввода-вывода
Сообщество разработчиков ядра годами совершенствовало подсистему ввода-вывода, чтобы даже в экстремальных сценариях (массовое копирование на медленные диски, системы с малым объемом оперативной памяти и т. д.) рабочий стол не зависал, а такие приложения, как браузер, не вылетали . В последних версиях ядра были введены механизмы, специально предназначенные для предотвращения чрезмерного потребления памяти и ресурсов процессора процессами записи.
В частности, была проделана работа по ограничению количества страниц памяти, которые могут оставаться в «грязном» состоянии одновременно, и по приоритезации передачи этой памяти на диск. Это особенно заметно при копировании на устройство, отформатированное в FAT32 или NTFS, и при этом необходимо обеспечить бесперебойную работу системы.
В предыдущих версиях ядра часто наблюдалось зависание графической среды на несколько секунд при перемещении нескольких гигабайт данных на дешевый USB-накопитель . В более новых версиях и при разумной конфигурации памяти этот эффект значительно уменьшен, что делает процесс копирования менее проблематичным.
Кроме того, в экосистеме Linux постоянно появляются инструменты и утилиты для анализа производительности кэш-памяти, ЦП и дисковых подсистем, такие как perf c2c , который позволяет пользователям видеть закономерности использования кэша на современных процессорах и выявлять узкие места. Хотя эти инструменты больше ориентированы на разработчиков и опытных администраторов, они помогают еще больше улучшить работу в высокопроизводительных средах.
Вся эта работа дополняется специальными оптимизациями для таких платформ, как ARM, и постоянно улучшающейся поддержкой различного оборудования. Короче говоря, хотя еще есть куда стремиться, состояние производительности ввода-вывода в Linux далеко не является простой «неисправленной ошибкой ». Скорее, это баланс между высокой производительностью, стабильностью и отзывчивостью системы.
Практические стратегии для ускорения копирования очень больших файлов.
Помимо настройки параметров ядра, существует несколько практических приемов, которые любой пользователь может применить для значительного сокращения времени передачи больших объемов данных , как в локальных копиях, так и по сети.
Один из наиболее эффективных методов, особенно при работе с тысячами файлов среднего или большого размера, — это сначала сжать данные на исходном диске, а затем переместить один большой файл на более медленный диск. Например, если вы хотите создать резервную копию своей медиатеки (Plex, фотографии, видео и т. д.), вы можете создать сжатый архив tar:
tar -czf backup-plex.tar.gz /ruta/a/tu/mediateca
После создания скопируйте файл tar.gz на USB-накопитель или удаленный сервер. Один пользователь, столкнувшийся с постоянно медленной загрузкой файлов на USB-жесткий диск, обнаружил, что такой подход (сжатие, перемещение и распаковка в месте назначения) позволил значительно сэкономить время по сравнению с использованием rsync для перемещения каталогов по одному.
Этот метод особенно эффективен, если исходный диск быстрый (например, внутренний NVMe-накопитель), а узкое место находится на целевом диске или в сети. Сжатие на быстром диске обычно намного быстрее, чем непрерывная запись на медленный, поэтому перемещение одного большого файла уменьшает накладные расходы, связанные с тысячами открытий и закрытий файлов , и существенно повышает эффективную пропускную способность.
В сфере сетевой передачи данных между машинами под управлением Linux можно также значительно улучшить производительность, используя сжатие «на лету» с помощью таких инструментов, как scp или rsync , выбирая передачу файлов с помощью Snapdrop или даже изменяя алгоритм шифрования SSH на более легкий, когда ограничивающим фактором является процессор, а не сеть.
Копирование по сети с использованием SCP: синтаксис и параметры ключа.
Когда вам нужно перемещать данные между серверами (или между вашим ПК и сервером), команда scp — один из самых простых и распространенных методов. SCP использует SSH для установления зашифрованного соединения «точка-точка», поэтому файлы передаются безопасно без необходимости настройки дополнительных служб, таких как FTP.
Базовый синтаксис очень похож на команду. cp В Unix достаточно добавить пользователя и хост назначения. Например, чтобы загрузить локальный файл на удаленный сервер:
scp archivo-local.tar usuario@servidor:/ruta/de/destino/
Эта команда скопирует файл file-local.tar в указанный путь на удаленном хосте , запросив пароль пользователя (или используя ваш SSH-ключ, если он у вас настроен). Чтобы скопировать файл с сервера на ваш компьютер, выполните обратную операцию:
scp usuario@servidor:/ruta/remota/archivo.tgz archivo-en-local.tgz
В этом случае файл file.tgz будет загружен с сервера и сохранен на вашем компьютере как file-in-local.tgz. Если вы хотите скопировать целые каталоги со всем их содержимым, необходимо добавить опцию рекурсивного копирования:
scp -r carpeta/ usuario@servidor:/ruta/destino/
Простой синтаксис — одна из причин, почему многие администраторы предпочитают SCP более сложным альтернативам, когда им нужно всего лишь переместить данные без дополнительных сложностей . Кроме того, поскольку он использует SSH, вам не нужно запускать дополнительные службы или открывать новые порты для интернета.
Ускорьте передачу данных по сети с помощью SCP (-C, -c, -l, -P…)
Команда scp предлагает ряд опций, которые при правильном использовании могут значительно улучшить как производительность, так и контроль над пропускной способностью и безопасностью соединения. Наиболее полезными для ускорения передачи являются следующие.
Выбор -C Это активирует сжатие данных на лету. На относительно медленных каналах связи (например, удаленное соединение со скоростью всего несколько Мбит/с) сжатие данных перед отправкой может существенно повлиять на результат. Измеренные случаи с файлом размером около 93 МБ показали, что время копирования без сжатия составляло около 1661 секунды, тогда как с... -C оно сократилось примерно до 162 секунд. примерно в десять раз быстрее.
Однако сжатие помогает только в том случае, если данные еще не сжаты. ZIP-архивы, RAR-архивы, ISO-файлы, JPEG-изображения и т. д. практически не улучшаются при использовании параметра -C и могут даже немного ухудшиться из-за дополнительной нагрузки на процессор. Для больших текстовых файлов, несжатых баз данных, логов или бинарных файлов это может быть отличным инструментом.
Опция -c позволяет выбрать алгоритм шифрования SSH, используемый во время передачи. По умолчанию обычно используется AES-128, который обеспечивает хороший баланс между безопасностью и производительностью. Однако, если по соображениям совместимости вы хотите использовать другой алгоритм, вы можете указать, например:
scp -c 3des archivo usuario@servidor:/ruta/
Следует избегать путать -c (шифр) с -C (сжатие), поскольку они выполняют совершенно разные функции. Изменение типа шифра редко значительно ускоряет работу на современных машинах, но на более старом или сильно ограниченном по мощности процессоре оборудовании это может оказать влияние.
Чтобы избежать перегрузки сети при создании очень больших копий, можно использовать опцию `-l` , которая ограничивает пропускную способность, используемую `scp`, в килобитах в секунду. Например:
scp -l 400 archivo usuario@servidor:/ruta/
Это устанавливает теоретический максимум примерно в 50 КБ/с (помните, что 8 бит = 1 байт). Это полезно, когда вы автоматизируете ежедневное резервное копирование или используете другие службы, которые не хотят испытывать нехватку пропускной способности во время выполнения большого резервного копирования.
Если SSH-сервер прослушивает нестандартный порт, это можно указать с помощью параметра -P (в верхнем регистре, поскольку нижний регистр -p уже используется для чего-то другого). Например, если служба находится на порту 2249:
scp -P 2249 archivo usuario@servidor:/ruta/
Наконец, есть и другие полезные параметры, такие как -p для сохранения времени модификации и прав доступа, -v для просмотра отладочной информации (оценочная скорость, отладочные сообщения SSH и т. д.) или -q для скрытия индикатора выполнения и некритических сообщений, что полезно в скриптах, где нежелателен лишний шум в выводе.
Безопасное резервное копирование через прокси и расширенные настройки SSH.
Во многих компаниях доступ к удалённым серверам осуществляется через HTTP-прокси или аналогичные инструменты. По умолчанию scp не взаимодействует с самим прокси , но SSH-клиент можно настроить на использование таких инструментов, как Corkscrew, для туннелирования соединения.
Типичный рабочий процесс заключается в создании файла. ~/.ssh/config с необходимыми директивами для подключения SSH к прокси-серверу (например, в 10.0.96.6:8080) и аутентифицировать, передав файл ~/.ssh/proxyauth Содержащие имя пользователя и пароль в открытом виде. После этого вызовы scp работают прозрачно, как если бы прокси-сервера не существовало, при условии, что установлен исполняемый файл corkscrew.
В средах, где часто приходится переключаться между корпоративной сетью (с использованием прокси) и общедоступными сетями без ограничений, постоянное редактирование конфигурации неудобно. Именно здесь на помощь приходит опция -F команды scp, позволяющая использовать альтернативный файл конфигурации SSH:
scp -F ~/.ssh/config-empresa archivo usuario@servidor:/ruta/
Таким образом, вы можете использовать разные конфигурационные файлы в зависимости от среды, сохраняя при этом тот же синтаксис scp и не ломая голову над постоянным изменением параметров.
Выберите между SCP и SFTP в зависимости от ваших потребностей.
И SCP, и SFTP используют одну и ту же основу: протокол SSH для шифрования и аутентификации . Однако они работают по-разному и не предназначены для одних и тех же целей, и важно понимать это, чтобы выбрать подходящий инструмент для каждой ситуации.
SCP выделяется своей простотой: синтаксис практически идентичен синтаксису SCP. cpОн разработан исключительно и просто для копирование файлов из одного места в другое И при этом он не зацикливается на других деталях. Он легковесный и очень эффективный для больших последовательных передач, с минимальными накладными расходами и без дополнительных уровней протокола.
SFTP, с другой стороны, представляет собой гораздо более полную подсистему. Она позволяет просматривать каталоги, выводить список содержимого, изменять права доступа, удалять файлы и т. д. , обеспечивая опыт, аналогичный FTP, но с безопасностью SSH. Многие графические инструменты (например, «FTP-подобные» клиенты) используют SFTP для предоставления привычного интерфейса для менее технически подкованных пользователей.
Платой за эту дополнительную функциональность является то, что SFTP, как правило, потребляет больше ресурсов и может быть немного медленнее, чем SCP, при передаче больших линейных файлов, особенно при работе со множеством небольших файлов. Тем не менее, для интерактивного использования или когда вам нужен «удаленный браузер», SFTP обычно является более удобным вариантом.
Как правило, если вам просто нужно безопасно и быстро передавать большие файлы , SCP обычно является лучшим вариантом. Однако, если вы хотите управлять структурой удаленных каталогов, изменять права доступа или предпочитаете интерфейс, похожий на FTP, SFTP подойдет лучше.
Опубликуйте веб-сайт или перенесите проекты с помощью SCP.
Использование scp не ограничивается случайным копированием пары файлов. Многие разработчики используют его ежедневно для развертывания веб-сайтов, загрузки версий приложений или синхронизации проектов между своим локальным компьютером и VPS или выделенным сервером.
Представьте, что ваш статический веб-сайт уже готов. /home/usuario/mi-web/ и сервер, к которому вы получаете доступ как root по IP-адресу. 123.45.67.89Чтобы загрузить весь контент в каталог, где Apache или Nginx обслуживают веб-сайт (/var/www/html/ (Во многих случаях) вы могли бы запустить:
scp -r /home/usuario/mi-web/* [email protected]:/var/www/html/
Флаг -r приводит к копированию всех подкаталогов и файлов с сохранением структуры. Если вы используете аутентификацию с помощью закрытого ключа вместо пароля, вы можете добавить -i, чтобы указать путь к ключу.
scp -i /ruta/a/tu_clave.pem -r /home/usuario/mi-web/* [email protected]:/var/www/html/
После завершения передачи просто войдите на сервер через SSH и убедитесь, что файлы находятся в нужном месте, используя, например, следующую команду:
ssh [email protected]
ls -l /var/www/html/
и убедитесь, что веб-сервер имеет права на их чтение. Благодаря тому, что домен указывает на IP-адрес VPS через DNS, ваш сайт будет запущен за считанные секунды . Такое сочетание SSH и SCP обеспечивает очень точный контроль над сервером и исключает зависимость от негибких панелей управления или FTP-клиентов.
Графические альтернативы в Windows: WinSCP и pscp.
Если вы работаете под управлением Windows, но ваши серверы работают на Linux, вам не обязательно использовать командную строку. Такие инструменты, как WinSCP, предлагают удобный графический интерфейс для передачи файлов с помощью SCP или SFTP, с панелями в стиле файлового менеджера, которые упрощают перетаскивание файлов.
С другой стороны, популярный SSH-клиент PuTTY включает в себя pscp — консольную утилиту, очень похожую на scp, которую можно использовать в скриптах или из командной строки Windows. Синтаксис схож, что упрощает перенос обычных команд Linux в эту среду.
В обоих случаях принцип один и тот же: используйте шифрование SSH для безопасной передачи данных , независимо от того, работаете ли вы в Linux, macOS или Windows, без необходимости включать менее защищенные сервисы, такие как классический FTP.
В совокупности понимание принципа работы кэша записи ядра, настройка нескольких параметров vm.dirty_*, выбор подходящего инструмента копирования (scp, rsync, SFTP, предварительное сжатие) и, при необходимости, использование графических решений, таких как WinSCP, позволяют перейти от бесконечных и, казалось бы, заблокированных операций копирования к гораздо более плавному и предсказуемому рабочему процессу, приближенному к реальной максимальной производительности вашего оборудования и сети.
Страстный писатель о мире байтов и технологий в целом. Мне нравится делиться своими знаниями в письменной форме, и именно этим я и займусь в этом блоге: покажу вам все самое интересное о гаджетах, программном обеспечении, оборудовании, технологических тенденциях и многом другом. Моя цель — помочь вам ориентироваться в цифровом мире простым и интересным способом.