Колхозное нагрузочное тестирование
Дано:
Приложение (на golang,в данном случае, но не суть важно).
Нужно:
Протестировать его под нагрузой. В частности, время ответа.
Простой способ, как протестировать приложение и получить график результата, без заморочек с graphite и ему подобных:
Идем на xively.com (бывший cosm) и регистрируем там девайс и канал.
Запускаем наше приложение на локале.
Пример скрипта проверки приложения и отсылки результата в xively:
#!/bin/bash # file testing.sh TIME=`curl -s -w "#"%{time_total} -XPOST -H 'Content-type: application/json' -d"{\"session_id\":\"sess\", \"chan\":\"channel\"}" http://localhost:8000/api/v1/get_data | cut -d'#' -f2` VALUE=`echo "$TIME*1000" | bc` POSTDATA="{\"version\":\"1.0.0\", \"datastreams\" : [{\"id\" : \"ch\", \"current_value\" : \"$VALUE\"}]}" echo $POSTDATA curl -XPUT -H 'X-ApiKey: DSFewrwewWEDVdfsdfsfdsf' -d"$POSTDATA" https://api.xively.com/v2/feeds/24234342
и запускаем это:
watch -n 1 ./testing.sh
Идем на сайт xively и смотрим на наш график.
Добавляем нагрузку:
#!/bin/bash #file run_ab.sh ab -T POST -c20 -n20 -p ab.txt http://localhost:8000/api/v1/get_data
Тут, думаю, все понятно. Утилита apache ab tester из пакета apache-utils, файл с post-данными и параметры.
Запскаем нагрузку:
watch -n 1 ./run_ab.sh
Вуаля.
Получаем какой-то более-менее, правдивый график, типа такого:
Полезное
Фейсбук для графиков
Для построения графиков можно поставить где-то на хостинге Munin И написать к нему плагинчик.
Или пойти более олдскульным путем и заюзать rrdtool напрямую. А можно не заморачиваться, и скормить свои данные полезному сервису, который нарисует и сохранит все Ваши графики.
Я, для примера, вывел данные о посещаемости RO-сервера: https://cosm.com/feeds/97476
Для начала хватит и этой доки: https://cosm.com/docs/v2/feed/update.html
PS: попутно нашел хороший сервис для проверки (GET, POST) запросов: http://www.hurl.it/
Проверить почту из bash
Скрипт, нарытый на просторах и немного доработанный. Возвращает количество непрочитанных сообщений.
atomlines=`wget -T 3 -t 1 -q --secure-protocol=TLSv1 --no-check-certificate --user=USERNAME@gmail.com --password=PASSWORD \ https://mail.google.com/mail/feed/atom/LABEL -O - | grep -Po '^.*?\K(?).*?(?= echo $atomlines
LABEL — это новые письма по метке, можно убрать, тогда будет просто инбокс
https://api.cosm.com/v2/feeds/97476/datastreams/players.png?width=730&height=250&colour=%23f15a24&duration=1day&show_axis_labels=true&detailed_grid=true&scale=auto&timezone=UTC
SSH, ограничение домашним каталогом
Проще говоря, ssh chroot.
Имеем сервер FreeBSD 7.2-RELEASE
Нужно дать ssh под один проект, но не хочется, чтоб там лишнее путалось под ногами, пусть ему будет доступна только его домашняя директория и Павлик Аштеэмэл. Поэтому копаем Гугль.
Из сотен похожих способов решения, находим один, который работает и отлично описан.
Из дополнительных действий — это лишь копирование bash, который у меня в качестве шела юзеру.
На всякий случай, продублирую сам скрипт
#!/bin/sh # В скрипт нужно передавать имя пользователя для которого создаем chroot окружение if [ "$1" = "" ] ; then echo " Usage: $0 [ username ]" exit fi USER=$1 GID=`cat /etc/master.passwd | grep "^$USER:" | cut -d ":" -f 4` HOME=/home/$USER # Задаем список бинарей, нужных для работы в chroot BINS=" /bin/cat \ /bin/chmod \ /bin/cp \ /bin/csh \ /bin/date \ /bin/df \ /bin/echo \ /bin/expr \ /bin/ln \ /bin/ls \ /bin/mkdir \ /bin/mv \ /bin/ps \ /bin/pwd \ /bin/rm \ /bin/rmdir \ /bin/sh \ /usr/bin/awk \ /usr/bin/bzip2 \ /usr/bin/diff \ /usr/bin/du \ /usr/bin/ee \ /usr/bin/fetch \ /usr/bin/find \ /usr/bin/grep \ /usr/bin/gunzip \ /usr/bin/gzip \ /usr/bin/less \ /usr/bin/sed \ /usr/bin/sort \ /usr/bin/scp \ /usr/bin/ssh \ /usr/bin/tail \ /usr/bin/tar \ /usr/bin/touch \ /usr/bin/vi \ /usr/bin/uname \ /usr/bin/uptime \ /usr/local/bin/mc \ /usr/local/bin/mcedit \ /usr/local/bin/mcmfmt \ /usr/local/bin/unrar \ /usr/local/bin/unzip \ " # Создаем структуру каталогов chroot окружения mkdir $HOME/bin mkdir $HOME/etc mkdir $HOME/home mkdir $HOME/home/$USER mkdir $HOME/lib mkdir $HOME/libexec mkdir $HOME/tmp mkdir $HOME/usr mkdir $HOME/usr/bin mkdir $HOME/usr/local mkdir $HOME/usr/local/bin mkdir $HOME/usr/local/etc mkdir $HOME/usr/local/share # Копируем бинарники в chroot окружение for item in $BINS; do cp $item $HOME$item done # Определяем какие библиотеки необходимо скопировать chroot for item in $BINS; do ldd $item |awk '{print $3}'|grep "." >> /tmp/libs done # Копируем библиотеки for item in `cat /tmp/libs|sort|uniq`; do cp $item $HOME/lib/ done # Копируем оставшиеся необходимые файлы и библиотеки cp /etc/termcap $HOME/etc/termcap cp /etc/resolv.conf $HOME/etc/resolv.conf cp /etc/nsswitch.conf $HOME/etc/nsswitch.conf cp -R /usr/local/share/mc $HOME/usr/local/share/mc cp /libexec/ld-elf.so.1 $HOME/libexec/ld-elf.so.1 # Создадим /etc/motd для пользователя echo "Welcome $USER" > $HOME/etc/motd # Теперь /etc/profile для него же echo 'export TERMCAP=/etc/termcap' > $HOME/etc/profile echo 'export PS1="$ "' >> $HOME/etc/profile # /etc/group тоже нужен свой cat /etc/group | grep $GID > $HOME/etc/group # Теперь внутри chroot создадим пользователя cat /etc/master.passwd|grep "^$USER:" > $HOME/etc/master.passwd pwd_mkdb -d $HOME/etc $HOME/etc/master.passwd # Выставляем права chown root:wheel $HOME chmod 755 $HOME chmod 755 $HOME chown -R $USER:$GID $HOME/bin chown -R $USER:$GID $HOME/etc chown -R $USER:$GID $HOME/home chown -R $USER:$GID $HOME/lib chown -R $USER:$GID $HOME/libexec chown -R $USER:$GID $HOME/tmp chown -R $USER:$GID $HOME/usr chmod 777 $HOME/tmp # Убираем за собой rm /tmp/libs
Ну и часть конфига ssh для этого юзера:
Match User пользователь ChrootDirectory /home/%u