Подтвердить что ты не робот

Воспроизведение постоянно записывается на диск? Вызвать более высокий счет на Amazon ec2

У меня есть Amazon ec2 Micro Instance (VPN-сервер), с которым можно поиграть.
Проблема в том, что Amazon взимает плату за каждый диск IO, который вы делаете в Micro Instance.
Экземпляр запускает Amazon Linux в стиле CentOS.

Я запустил приложение Scala в платформе 2.0 (.2) на сервере, и я единственный, кто подключается к приложению.

Я заметил, что каждые несколько секунд что-то на сервере совершает транзакции ввода-вывода, чтобы сузить его, я установил программу Linux под названием iotop.

Вот результат через пару секунд.

TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    
23333 be/4 root        0.00 B/s   11.91 K/s  0.00 %  0.00 %  
COMMAND java -Dsbt.ivy.home=/usr/play-2.0.2/framework/../repository -Djava.runtime.name=OpenJDK ~/jars/slf4j-api.jar:/usr/play-2.0.2/repository/local/org.slf4j/jul-to-slf4j/1.6.4/jars/j

Кошка из файла журнала

cat /home/ec2-user/socketTest/logs/application.log
2012-07-05 11:43:31,881 - [INFO] - from play in main
Listening for HTTP on port 9000...

Итак, Play ничего не записывает в файл журнала.

Первый вопрос: я понял, что правильный iotop и что Play действительно является вором IO диска.
Если да, то зачем играть в IO?

Мое приложение - простой пример веб-раскладки. По сути, он выводит входной сигнал на выход. IO встречается даже в том, что ничто не сдвигается через веб-сайты.

4b9b3361

Ответ 1

Наконец-то я нашел ответ.

Наблюдая, когда Play совершил транзакцию IO, я немедленно выполнил эту команду:

touch -d '-10 seconds' /tmp/newerthan
find / ! -fstype proc -newer /tmp/newerthan

Это вернуло одну интересную строку:

/tmp/hsperfdata_root/23320

Во время поиска на этом я наткнулся на ID ошибки: 5012932 from sun JVM создает подкаталог "hsperfdata_xxx" . Java делает это для обеспечения неинвазивной наблюдаемости JRE, они утверждают, что это функция, а не ошибка, почему она не была разрешена.
Решение, предназначенное для отключения этой "функции", состояло в том, чтобы использовать недокументированную опцию -XX:-UsePerfData. Я пробовал это, но, к сожалению, Play продолжал делать транзакции ввода-вывода.

Но после некоторого дополнительного рытья я нашел еще один переключатель -XX:+PerfDisableSharedMem.

Итак, я выполнил export _JAVA_OPTIONS="-XX:+PerfDisableSharedMem" перед запуском Play.

И... Voilà Play перестала делать транзакции IO!

Ответ 2

Если вы хотите узнать, какие файлы записываются, вы можете использовать inotifywait, который поставляется в пакете inotify-tools (по крайней мере, то, что Fedora вызывает):

$ inotifywait -r -m /opt /etc /var -e ATTRIB -e CREATE -e MODIFY -e DELETE
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/var/tmp/ CREATE etilqs_uOXWfa8v7DkNBgd
/var/tmp/ DELETE etilqs_uOXWfa8v7DkNBgd
/var/tmp/ MODIFY etilqs_uOXWfa8v7DkNBgd
/var/tmp/ MODIFY etilqs_uOXWfa8v7DkNBgd
/var/tmp/ MODIFY etilqs_uOXWfa8v7DkNBgd
  ...

Очевидно, замените "/opt/etc/var" выше на любые интересующие вас каталоги.

Это почти наверняка намного эффективнее, чем запуск lsof в цикле и grepping его вывод. Но вы, вероятно, не должны оставлять его работать в течение длительного времени в производстве.

В любом случае, как только вы узнаете, какие файлы записываются, вы будете на пути к его прекращению.:)

Ответ 3

Вы также можете рекурсивно ls создать свой каталог и отсортировать его по atime (или mtime или что-то еще)

Ответ 4

Еще одно решение (простое, но полезное):

# watch df

Затем вы можете запустить это, чтобы глубже:

# du -s /your/path/