Воспроизведение постоянно записывается на диск? Вызвать более высокий счет на 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 встречается даже в том, что ничто не сдвигается через веб-сайты.
Ответы
Ответ 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/