Pull to refresh
6
0
Send message
Для мониторинга и администрирования есть Calamari
Это не ограничение архитектуры и у apache много решений. В статье речь идёт про используемый по умолчанию prefork, есть ещё event, использующий тот же epoll/kqueue и worker, являющийся чем-то средним между предыдущими. Ну и кучка более экзотических модулей.

Если говорить про все возможные варианты, то ИМХО проблема apache не в том, что он кривой и медленный, а в том, что в попытке объединить в себе web и application сервер, он стал слишком навороченным и сложным.

Можно даже использовать один экземпляр apache с mpm_event/mpm_worker/mpmt_os2/mpm_netware + mod_proxy как проксирующий web сервер, второй с mpm_prefork как application сервер и возможно эта связка не сильно уступит классическим nginx+apache/php-fpm/etc.

Я не фанат apache и предпочту использовать nginx, если такой вариант в принципе возможен, но в контексте данной статья мне показалось уместным упомянуть о том, что не prefork'ом единым жив старый индеец.
Вместо костыля с перезапуском через 5 минут, я бы рекомендовал использовать встроенные в certbot хуки: в данном случае post-hook, который описан тут

Т.е. вместо строк в crontab'e:
30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log
35 2 * * 1 /usr/bin/systemctl reload nginx


достаточно использовать:
30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew --post-hook "service nginx reload" >> /var/log/le-renew.log
Так же помимо размера permgen иногда помогает -XX:NewRatio который отвечает за молодое поколение

основной принцип работы gc:
заполнился eden? — чистим мертвецов, выживших закидываем в survivor
заполняется survivor? — меняем местами 2 наших слота survivor (с полным работаем, свободный становится активным, пошло заполнение с eden), вышившие в old
заполнился old? — ну тут уже глобал счастье, курите все пока мы разбираемся с мусором (а при большом heap дело нешустрое)

Основное правило явы «живи быстро, умри молодым», в случае недостаточного количества под young не выполняется.
По умолчанию выделяется достаточно низкий уровень, в итоге под нагрузкой eden забивается моментом, survivor тоже оказывается заполненный, а следовательно объект сразу попадает в old.

В итоге имеем ситуацию:
1. eden дёргается сборщиком мусора практически непрерывно, доп нагрузка на проц.
2. данные перетекают сразу в old, хотя уже в следующий момент оказываются мертвы и лишь занимают память, когда же заполниться old, то сборка по нему это уже совсем другая история с нагрузками на проц.

увеличивая размер eden имеем
1. eden заполняется постепеннь, выжившие зачастую влезают в survivor, так как те кто там уже были к этому времени почти все поумирали
2. old заполняется уже намного медленнее, следовательно глобальный сборщик запуститься позже или отработает меньше времени.

хотя слишком усердствовать тоже не надо, так как алгоритмы сборки мусора по old более оптимальны по скорости сборки и под большие объёмы, во всём нужно искать середину.
Идея интересная, но что будет при split brain? Более безопасный вариант http://clusterlabs.org/wiki/PgSQL_Replicated_Cluster
Не знаю, что может быть легче трех строк кода:

import logging
log = logging.getLogger('modulename')
logging.basicConfig(level=logging.DEBUG)


Дальше вместо print, использовать log:

log.debug("Message")


Пример выше всего лишь более подробный, и logging — находится в стандартной библиотеке python. Дополнительно устанавливать ничего не нужно.
Я считаю, что написать «log.debug('message')» не сложнее, чем написать print('message'), и этому нужно учить сразу в том числе школьников, и новичков. Вредные привычки, приобретенные во время обучения искореняются с большим трудом.

import flask
import logging
app_test = flask.Flask(__name__)
log = logging.getLogger(__name__)

@app_test.route("/ping")
def ping():
   return "pong"

@app_test.route("/add")
def add():
   log.debug(flask.request.args.to_dict())
   return str(flask.request.args)

@app_test.route("/remove")
def remove():
   log.debug(flask.request.args.to_dict())
   return str(flask.request.args)

if __name__ == "__main__":
   logging.basicConfig(level=logging.DEBUG)
   app_test.run(host='0.0.0.0')


Это существенное усложнение?
Для блока рекламы прописал заглушку в etc/hosts (для Windows по-умолчанию c:\Windows\System32\drivers\etc\hosts):
127.0.0.1 apps.skype.com
127.0.0.1 api.skype.com
127.0.0.1 static.skypeassets.com
127.0.0.1 rad.msn.com
127.0.0.1 adriver.ru
Это плохо:
rewrite ^(.*) https://www.blabla.ru$1 permanent;

должно быть так:
return 301 https://www.blabla.ru$request_uri;
Из серьезных книг — пожалуй вот эти:

DevOps: High-impact Strategies — What You Need to Know: Definitions, Adoptions, Impact, Benefits, Maturity, Vendors
Roebuck, Kevin

Web Operations: Keeping the Data On Time
Allspaw, John, Robbins, Jesse

Cloud Computing Architected: Solution Design Handbook
Rhoton, John, Haukioja, Risto

Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation (Addison-Wesley Signature Series (Fowler))
Farley, David, Humble, Jez

Pro Puppet
Turnbull, James, James Turnbull, Jeffrey McCune December 8, 2011

Pulling Strings with Puppet: Configuration Management Made Easy
Turnbull, James

Configuration Management: High-impact Strategies — What You Need to Know: Definitions, Adoptions, Impact, Benefits, Maturity, Vendors
Roebuck, Kevin

А из статей и блогов:
Стоит обрать внимание на этот и этот блоги. А так же на хэштеги #opschef, #puppet и #devops и прочие тематические в твиттере.
Хорошее полное описание. Если пользоваться данным способом — подобная шпаргалка должна быть)

Тоже использую Percona, но с базой в <10 Гб. Пользуюсь дампом в sql-файл. Чтобы снять бекап без блокировки таблиц пользуюсь такими ключами:
#!/bin/bash
TODAY=$(date '+%Y-%m-%d')
...
mysqldump -uuser -ppassword --single-transaction --quick --lock-tables=false database_name | pv > /path/to/backup/folder/$TODAY/$TODAY.database_name.sql
...

В многоточиях описания разных состояний, бекап файловой структуры, архивация и отправка на S3.
Без показа текущего состояния и метки времени:
mysqldump -uuser -ppassword --single-transaction --quick --lock-tables=false database_name /path/to/backup/folder/database_name.sql

С pv можно ограничить скорость создания дампа (если чтение с базы быстрее скорости дисков и iowait уходит в 100%, в результате чего создание дампа мешает другим сервисам работать с диском) можно добавить: pv -L 10m, где 10m — ограничение в 10 Мб/с.
Внимательные читатели, конечно, заметили, что как бы мы не хитрили — от передачи пароли и временного ключа в открытой или хэшированной форме нам никуда не деться.

Деться: временный ключ мы шифруем алгоритмом с открытым ключом.

wiki.python.org/moin/HowTo/Sorting — не оно? Всё расписано.

Кстати, вместо
sortList.sort(key=sortByLength)

можно просто писать
sortList.sort(key=len)

Также, что бы не плодить лишние функции утилитарные можно использовать лямбды.
Сноуболл-калькулятор: вводите все долги и процентные ставки и получаете наиболее выгодный порядок погашения.
www.whatsthecost.com/snowball.aspx
Большое спасибо моему коллеге за эту публикацию и за инвайт.
Я постараюсь ответить на Ваш вопрос, какое оборудование является самым новым.

У компании Alcon это система WaveLight.
У Shwind это установка Amaris 750S.
У ZEISS это соответственно VisuMax и эксимерный лазер MEL 90 (этот пока не прошел сертификацию в России).
У Abbott это установка Star S4 (у них самое дорогое сопровождение).

Отдельно можно рассмотреть продукцию компании Nidek, у них другой принцип работы — вращающаяся щель (у всех это flying spot). Установки называются EC-5000 и более новая Quest.
Прохоренок Н. А. «PyQt4. Создание оконных приложений на Python 3». На русском.
Поправлю sms-reg.COM — проверено годами. Пользуюсь, советую так как очень большой выбор номеров и постоянное наличие.
Или, можно пользоваться сервисами активаций. Например sms-area.org или sms-reg.org. Найти левый номер уже давно не проблема.
Есть очень полезная штука github.com/lxctl/lxctl. В убунте она уже есть.

Information

Rating
Does not participate
Registered
Activity