Почему я вижу больше процессов в KVM, чем в OpenVZ?

Общий путь

$ cat input.log | sed -e "s/^/$(date -R) /" >> output.log

Как это работает:

  1. cat файл чтений называют input.log и просто печать это к его потоку стандартного вывода.

    Обычно стандартный вывод подключен к терминалу, но этот небольшой сценарий содержит | таким образом, оболочка перенаправляет стандартный вывод cat к стандартному входу sed.

  2. sed считывает данные (как cat производит его), процессы он (согласно сценарию, обеспеченному -e опция), и затем печатает его к ее стандартному выводу. Сценарий "s/^/$(date -R) /" средства заменяют каждый запуск строки к тексту, сгенерированному date -R команда (общая конструкция для команды замены: s/pattern/replace/).

  3. Затем согласно >> bash перенаправляет вывод sed в названный файл output.log (> средства заменяют содержание файла и >> средства добавляют в конец).

Проблема $(date -R) оцененный однажды, когда Вы запустите скрипт, таким образом, он вставит текущую метку времени в начало каждой строки. Текущая метка времени может быть далекой с момента, когда сообщение было сгенерировано. Для предотвращения его, необходимо обработать сообщения, поскольку они записаны в файл, не с заданием крона.

FIFO

Стандартное потоковое перенаправление описано выше названного канала. Можно перенаправить его не только с | между командами в сценарии, но через файл FIFO (иначе именованный канал). Одна программа запишет в файл, и другой считает данные и получит их, когда первое отправляет.

Выберите пример:

$ mkfifo foo.log.fifo
$ while true; do cat foo.log.fifo | sed -e "s/^/$(date -R) /" >> foo.log; done;

# have to open a second terminal at this point
$ echo "foo" > foo.log.fifo
$ echo "bar" > foo.log.fifo
$ echo "baz" > foo.log.fifo

$ cat foo.log      

Tue, 20 Nov 2012 15:32:56 +0400 foo
Tue, 20 Nov 2012 15:33:27 +0400 bar
Tue, 20 Nov 2012 15:33:30 +0400 baz

Как это работает:

  1. mkfifo создает именованный канал

  2. while true; do sed ... ; done выполняет бесконечный цикл, и при каждом повторении он работает sed с перенаправлением foo.log.fifo к его стандартному входу; sed блоки в ожидании входных данных и затем обрабатывают полученное сообщение и печатают его к стандартному выводу, перенаправленному к foo.log.

    В этой точке необходимо открыть новое окно терминала, потому что цикл занимает текущий терминал.

  3. echo ... > foo.log.fifo печатает сообщение к его стандартному выводу, перенаправленному в файл FIFO и sed получает его и обрабатывает и пишет в регулярный файл.

Важное примечание является FIFO так же, как любой другой канал не имеет никакого смысла, если одна из его сторон не подключена ни к какому процессу. При попытке записать в канал, то текущий процесс заблокируется, пока кто-то не считал бы данные с другой стороны канала. Если Вы захотите читать из канала, то процесс заблокируется, пока кто-то не запишет данные в канал. sed цикл в примере выше ничего не делает (сны), пока Вы не делаете echo.

Для Вашей конкретной ситуации Вы просто настраиваете свое приложение для записи сообщений журнала в файл FIFO. Если Вы не можете настроить его - просто удаляют исходный файл журнала и создают файл FIFO. Но отметьте снова это если sed цикл умрет по некоторым причинам - Ваша программа будет заблокирована после попытки к write в файл, пока кто-то не будет read от FIFO.

Преимущество является текущей меткой времени, оцененной и приложенной к сообщению, поскольку программа пишет это в файл.

Асинхронная обработка с tailf

Для создания записи в журнал и обработки более независимыми, можно использовать два регулярных файла с tailf. Приложение запишет сообщение в необработанный файл, и другие новые строки чтения процесса (следуйте к записям асинхронно), и обработайте данные с записью во второй файл.

Давайте возьмем пример:

# will occupy current shell
$ tailf -n0 bar.raw.log | while read line; do echo "$(date -R) $line" >> bar.log; done;

$ echo "foo" >> bar.raw.log
$ echo "bar" >> bar.raw.log
$ echo "baz" >> bar.raw.log

$ cat bar.log

Wed, 21 Nov 2012 16:15:33 +0400 foo
Wed, 21 Nov 2012 16:15:36 +0400 bar
Wed, 21 Nov 2012 16:15:39 +0400 baz

Как это работает:

  1. Выполненный tailf процесс, который будет следовать за записями к bar.raw.log и распечатайте их к стандартному выводу, перенаправленному к большому количеству while read ... echo цикл. Этот цикл выполняет два действия: считайте данные от стандартного входа до буферной названной переменной line и затем запишите сгенерированную метку времени со следующими буферизированными данными к bar.log.

  2. Запишите некоторые сообщения в bar.raw.log. Необходимо сделать это в отдельном окне терминала, потому что первый будет занят tailf который будет следовать за записями и делать его задание. Довольно простой.

Профессионалы являются Вашим приложением, не заблокировался бы, если Вы уничтожаете tailf. Недостатки являются менее точными метками времени и копирующий файлы журнала.

2
11.12.2013, 01:28
2 ответа

Это главным образом нормальные процессы, которым необходимо подвергнуться при выполнении дистрибутива Linux на чистом металле или как виртуальная машина на других технологиях, таких как KVM или VirtualBox. Различие, которое Вы видите, может быть непосредственно приписано технологическим различиям в виртуализации.

Технологии, такие как KVM & VirtualBox, виртуализируйте на аппаратном уровне, по существу обеспечив виртуальные версии аппаратных средств к гостевым Ose. Технологии, такие как OpenVZ виртуализируют на уровне процесса, поэтому каждый гость, VM имеет их собственное init процесс, но они все совместно используют то же Ядро Linux. Поэтому при использовании OpenVZ, все гостевые Ose должны быть тем же распределением как хост ОС.

Преимуществом использования OpenVZ, как можно засвидетельствовать о, являются намного меньшие места, которые гостевые Ose должны использовать, таким образом, оставив больше ресурсов системы доступным, чтобы быть посвященными VMs.

Основные недостатки к использованию OpenVZ состоят в том, что все гости должны использовать то же Ядро, и специальное Ядро Linux должно сохраняться с включенными технологиями OpenVZ.

Таким образом, нет ничего для удаления затем?

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

Пример

Вот система, которую я недавно устанавливаю (CentOS 6.5) для использования в качестве веб-прокси. Я выполняю систему в runlevel 3, так как это не имеет никакого GUI и является в основном просто сервером.

$ sudo chkconfig --list | grep 3:on
NetworkManager  0:off   1:off   2:on    3:on    4:on    5:on    6:off
acpid           0:off   1:off   2:on    3:on    4:on    5:on    6:off
auditd          0:off   1:off   2:on    3:on    4:on    5:on    6:off
blk-availability    0:off   1:on    2:on    3:on    4:on    5:on    6:off
cpuspeed        0:off   1:on    2:on    3:on    4:on    5:on    6:off
crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off
haldaemon       0:off   1:off   2:off   3:on    4:on    5:on    6:off
irqbalance      0:off   1:off   2:off   3:on    4:on    5:on    6:off
livesys         0:off   1:off   2:off   3:on    4:on    5:on    6:off
livesys-late    0:off   1:off   2:off   3:on    4:on    5:on    6:off
lvm2-monitor    0:off   1:on    2:on    3:on    4:on    5:on    6:off
messagebus      0:off   1:off   2:on    3:on    4:on    5:on    6:off
netfs           0:off   1:off   2:off   3:on    4:on    5:on    6:off
nginx           0:off   1:off   2:on    3:on    4:on    5:on    6:off
ntpd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
postfix         0:off   1:off   2:on    3:on    4:on    5:on    6:off
rsyslog         0:off   1:off   2:on    3:on    4:on    5:on    6:off
sshd            0:off   1:off   2:off   3:on    4:on    5:on    6:off
sysstat         0:off   1:on    2:on    3:on    4:on    5:on    6:off
udev-post       0:off   1:on    2:on    3:on    4:on    5:on    6:off

Если у Вас есть какие-либо сервисы, что Вы знаете, что Вам не нужно затем, я поощряю Вас отключать их как так. Это - 2 процесса шага. Первый шаг остановит сервис. Второй шаг отключит тот сервис от запуска снова во время перезагрузок.

$ sudo /etc/init.d/nginx stop
$ sudo chkconfig nginx off

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

5
27.01.2020, 21:51
  • 1
    Хороший ответ, но хотя необходимо выполнить гостей Linux с openzv, не вся потребность быть той же ОС. Я обычно выполняю или Centos или Debian как openVZ гости. Очень простое решение при выполнении openvz, состоит в том, чтобы использовать Proxmox (хост Debian + KVM + openvz + веб-интерфейс для гостевого управления). –  Panther 11.12.2013, 18:54
  • 2
    @bodhi.zazen - Они все используют то же ядро хотя, нет? Я использую OpenVZ на CentOS 5.x и думал, что они все использовали то же Ядро. –  slm♦ 11.12.2013, 19:08
  • 3
    Да, гости все использование то же ядро, и если Вы определяете ОС как ядро, затем да, они все используют ту же ОС. ОС является неопределенной, хотя, поскольку многие люди включают больше затем ядро (Linux по сравнению с GNU/Linux, я предполагаю). Администрирование, репозитории и пакеты будут меняться в зависимости от гостя. Я размещаю несколько "проектов с открытым исходным кодом", использующих openvz, и люди почти никогда не спрашивают меня что ядро хотение работать, хотение выполнить гостя Debian/Centos в зависимости от их sys администраторских предпочтений/опыта. –  Panther 11.12.2013, 19:13
  • 4
    @bodhi.zazen - не было мое намерение подразумевать ОС == Ядро, я очищу текст. Фиксированный! –  slm♦ 11.12.2013, 19:14
  • 5
    @bodhi.zazen - да, большинство людей не обращает внимания на версию Ядра. Я также выполняю свою всю инфраструктуру на OpenVZ, таким образом, на самом деле потрясающе с точки зрения предоставления Вам контейнеры сохранить стопки сервера w/in. Но все еще поймите большую часть использования своих ресурсов по KVM и т.д. –  slm♦ 11.12.2013, 19:17

Большинство тех процессов - те внизу со всей нулевой статистикой - является потоками ядра. Вы не будете видеть их под OpenVZ, потому что включение отличается.

Это оставляет Вас с 17 фактическими процессами пространства пользователя. Из тех единственные, которые можно было бы считать ненужными на VPS, mingettyно:

  • Избавление от тех потребовало бы реконфигурирования init демона.

  • О них являются крошечными и неактивными и не стоит волноваться. Если поставщику VPS настраивали систему этот путь, просто оставьте его.

3
27.01.2020, 21:51

Теги

Похожие вопросы