Как я могу ограничить кеш, используемый при копировании, чтобы еще сохранилась память для другого кеша?

Основная ситуация:

Я копирую некоторые диски NTFS в openSuSE. Каждый из них составляет 2 ТБ. Когда я это делаю, система работает медленно.

Мои предположения:

Я считаю, что это, скорее всего, связано с кэшированием. Linux решает отказаться от полезного кеша (например, kde4 bloat, виртуальных машин, двоичных файлов LibreOffice, двоичных файлов Thunderbird и т.д.) И вместо этого заполнить всю доступную память (всего 24 ГБ) материалами из копирующих дисков, которые будут прочитаны только один раз, затем пишется и никогда не используется снова. Таким образом, в любое время, когда я использую эти приложения (или kde4), диск должен быть снова прочитан, а чтение раздувания с диска снова заставляет замораживать/икать.

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

Так как это USB, контроллер диска и диска не является узким местом, поэтому использование ионитов не ускоряет работу.

Я считаю, что кеш, а не только материнская плата идет слишком медленно, потому что, если я прекращу все копирование, она по-прежнему работает прерывисто, пока она не перескакивает все. И если я перезапущу копирование, это займет минуту, прежде чем он снова портится. Но также я могу ограничить его примерно до 40 Мбайт/с, и он работает быстрее (не потому, что он имеет правильные вещи в кэше, а потому, что шины материнской платы имеют большую дополнительную пропускную способность для системных дисков). Я могу полностью согласиться с потерей производительности, из-за которой полностью потребляется моя способность IO материнской платы (которая используется на 100%, что означает 0% потерянной мощности, что делает меня счастливым), но я не могу согласиться с тем, что этот механизм кэширования работает так ужасно в этом конкретном использовании случай.

# free
             total       used       free     shared    buffers     cached
Mem:      24731556   24531876     199680          0    8834056   12998916
-/+ buffers/cache:    2698904   22032652
Swap:      4194300      24764    4169536

Я тоже пробовал то же самое на Ubuntu, что и приводит к зависанию всей системы.;)

И чтобы уточнить, я не спрашиваю, как оставить память свободной для "системы", но для "кеша". Я знаю, что кэш-память автоматически возвращается в систему по мере необходимости, но моя проблема в том, что она не зарезервирована для кэширования определенных вещей.

Вопрос:

Есть ли способ сообщить этим операциям копирования ограничить использование памяти, поэтому некоторые важные вещи остаются кешированными, и поэтому любые замедления являются результатом нормального использования диска и не перечитывают те же наиболее часто используемые файлы? Например, существует ли настройка максимальной памяти для каждого процесса/пользователя/файловой системы, которую можно использовать в качестве кеша/буферов?

Ответы

Ответ 1

Команда nocache - это общий ответ на эту проблему! Смотрите https://github.com/Feh/nocache или найдите его в Debian и Ubuntu 13.10 (дерзкий).

Спасибо, Питер, за то, что предупредил нас о опции -drop-cache в rsync. Но это было отклонено вверху (Ошибка 9560 - опция кэширования кэша), в пользу более общего решения для этого: новая команда "nocache", основанная на работе rsync с fadvise.

Вы просто добавляете "nocache" к любой команде, которую хотите. Он также имеет приятные утилиты для описания и изменения состояния кеша файлов. Например. вот эффекты с и без nocache:

$ ./cachestats ~/file.mp3
pages in cache: 154/1945 (7.9%)  [filesize=7776.2K, pagesize=4K]
$ ./nocache cp ~/file.mp3 /tmp
$ ./cachestats ~/file.mp3
pages in cache: 154/1945 (7.9%)  [filesize=7776.2K, pagesize=4K]\
$ cp ~/file.mp3 /tmp
$ ./cachestats ~/file.mp3
pages in cache: 1945/1945 (100.0%)  [filesize=7776.2K, pagesize=4K]

Так надеемся, что это сработает для других программ резервного копирования (rsnapshot, duplicity, rdiff-backup, amanda, s3sync, s3ql, tar и т.д.) и других команд, которые вы не хотите уничтожать кеш.

Ответ 2

Kristof Provost был очень близок, но в моей ситуации я не хотел использовать dd или писать свое собственное программное обеспечение, поэтому решение заключалось в использовании опции "-drop-cache" в rsync.

Я использовал это много раз с момента создания этого вопроса, и, похоже, проблема полностью устранена. Единственным исключением я использовал rsync для копирования с компьютера FreeBSD, который не поддерживает "-drop-cache". Поэтому я написал оболочку, чтобы заменить команду /usr/local/bin/rsync, и удалите эту опцию, и теперь она также работает с копированием.

Он по-прежнему использует огромное количество памяти для буферов и, похоже, почти не имеет кэш-памяти, но работает в любом случае.

$ free
             total       used       free     shared    buffers     cached
Mem:      24731544   24531576     199968          0   15349680     850624
-/+ buffers/cache:    8331272   16400272
Swap:      4194300     602648    3591652

Ответ 3

Невозможно, если вы используете простой старый cp, но если вы захотите повторно реализовать или исправить его, настройка posix_fadvise(fd, 0, 0, POSIX_FADV_NOREUSE) как на входном, так и на выходном файле, вероятно, поможет.

posix_fadvise() сообщает ядру о вашем предполагаемом шаблоне доступа. В этом случае вы будете использовать данные только один раз, поэтому нет смысла его кэшировать. Ядро Linux чтит эти флаги, поэтому больше не нужно кэшировать данные.

Ответ 4

попробуйте использовать dd вместо cp.

Или mount файловая система с флагом sync.

Я не совсем уверен, что эти методы обходят своп, но, возможно, стоит попробовать.

Просто мой 2c.

Ответ 5

Я копирую некоторые диски NTFS [...] система работает медленно. [...] Так как это USB [...]

Замедление является известной проблемой управления памятью.

Используйте более новое ядро Linux. У старых есть проблема с данными USB и "прозрачными огромными страницами". Смотрите эту статью LWN. Совсем недавно эта проблема была решена, см. "Управление памятью" в LinuxChanges.

Ответ 6

Ядро не может знать, что вы не будете использовать кэшированные данные при повторном копировании. Это ваше информационное преимущество.

Но вы могли бы установить swapiness в 0: sudo sysctl vm.swappiness = 0. Это приведет к тому, что linux отбросит кеш до того, как библиотеки и т.д. Будут записаны в swap.

Работает хорошо для меня тоже, особенно очень эффектно в сочетании с hugh ram (16-32 ГБ).

Ответ 7

Хорошо, теперь, когда я знаю, что вы используете rsync, и я мог бы копать немного больше:

Кажется, что rsync неэффективен при использовании с несколькими файлами в то же время, есть запись в их FAQ, это не проблема с linux/cache, проблема с rsync заключается в том, что слишком много ОЗУ.

Поиск в Google кто-то рекомендовал разделить синхронизацию в нескольких rsync invocations

Надеюсь, что это поможет.