Отладка утечек памяти в Django

Не так давно мне нужно было отловить утечку памяти в Django проекте. Для отладки был выбран Guppy. Для начала использования Guppy нам потребуется 5 минут и 5 простых шагов.

  1. Для начала установим наш инструмент отладки: pip install guppy

  2. Теперь нам нужно добавить следующий код в наш главный urls.py. import guppy
    from guppy.heapy import Remote
    Remote.on()

  3. Запускаем наш Django поект. Не забудьте выключить режим отладки, иначе все запросы к базе будут кешироваться и занимать память. DEBUG = False

  4. Теперь в терминале нужно выполнить команду python -c "from guppy import hpy;hpy().monitor()". Дальше мы будем использовать следующие комманды:

    • lc - увидеть процессы
    • sc - подключится к процессу
    • int - перейти в интерактивную консоль
    • hp.heap() - увидеть количество потребляемой памяти
    • hp.setref() - очистить информацию о количестве памяти
  5. Начинаем отладку. Смотрим количество памяти используя hp.heap(), затем очищаем эту информацию с помощью комманды hp.setref(). Делаем действия, которые по нашему мнению текут, и смотрим на hp.heap().

Использование Docker в терминале Mac Os X

Этот небольшой пост посвящен именно использованию докера на маке. Если у вас еще не установили докер, просто следуйте документации.

Итак, у вас есть установленный Vagrant и VirtualBox, также вы имеете склонированные репозиторий с докером и запущенное виртуальное окружение.

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

Если у вас нет Go, то его нужно установить, а также установить Mercurial (он понадобиться чуть позже).

brew install go --devel --cross-compile-common --with-cgo

Теперь создадим временную папку tmp, в которую скачаем все зависимости для компилирования докера. Mercurial нам нужен для того, чтобы получить все зависимости, так как одна из них лежит в меркуриал репозитории.

mkdir tmp
export GOPATH=`pwd`/tmp
go get -v github.com/dotcloud/docker/docker

В склонированном репозитории докера нужно переключиться на последнюю версию (в моем случае это v0.7.5), в скаченных зависимостях нужно найти докер и тоже переключиться на последнюю версию.

Немного отвлечемся от компилирования докера, оставив на последок, и перейдем к работе с виртуальной машиной. После трех простых шагов манипуляции с виртуальной машиной будут закончены.

  1. Нам нужно добавить строчку с пробросом порта в блок Vagrant::Config.run нашего Vagrantfile.

     config.vm.forward_port 4243, 4243
    
  2. Теперь немного изменим файл /etc/init/docker.conf внутри виртуальной машины.

     description "Docker daemon"
    
     start on filesystem and started lxc-net
     stop on runlevel [!2345]
    
     respawn
    
     script
         /usr/bin/docker -d -H=tcp://0.0.0.0:4243/
     end script
    
  3. Перезагрузим виртуальную машину

     vagrant reload
    

После всех наших действий нам осталось запустить компиляцию докера. Перейдем в наш склонированный репозиторий в папку docker и запустим компиляцию

go build docker.go

Наконец-то можете проверить работу докера

./docker -H tcp://127.0.0.1:4243/ version

План на YAC 2013

Совсем скоро Yet another Conference 2013 и я вроде как определился с планом посещения докладов.

Время Название Спикер
11:30 - 12:30 Рекомендации по проектированию API Марина Степанова, Яндекс
13:00 - 13:45 Добро пожаловать в SoundCloud! Александр Ковалев, SoundСloud
13:45 - 14:30 Вклад Adobe в Web Дмитрий Барановский, Adobe
15:00 - 15:45 API Design at GitHub Jason Rudolph, GitHub
16:00 - 16:30 Кофе-брейк
16:30 - 17:10 Architecting and testing large iOS apps: lessons from Facebook Adam Ernst, Facebook
17:10 - 17:50 The evolution of mobile apps Alan Cannistraro, Facebook
17:50 - 18:35 API для людей: как создать API, которым по-настоящему пользуются Евгений Чеботарев, 500px
18:45 - 19:30 How to Destroy The Web Bruce Lawson, Opera Software

Backbone.js и Django REST framework

Проходя курс Connected to the Backbone я использовал Django REST framework для построения простого апи, которое затем использовал в backbone приложении.

В backbone приложение мы используем простую модель для примера, а также добавим коллекцию для большей наглядности.

App.Models.Task = Backbone.Model.extend({
    defaults: {
        title: '',
        is_completed: false
    },
    urlRoot: '/tasks/'
});

App.Collections.Tasks = Backbone.Collection.extend({
    model: App.Models.Task,
    url: 'tasks/'
});

Модель в django приложении будет подоба нашей модели в backbone приложении.

class Task(models.Model):
    title = models.CharField('Title', max_length=1000)
    is_completed = models.BooleanField('Is completed', default=False)

Теперь нам нужно создать сериализатор для нашей модели задач и отображение для него.

class Task(models.Model):
    title = models.CharField('Title', max_length=1000)
    is_completed = models.BooleanField('Is completed', default=False)
class TaskViewSet(viewsets.ModelViewSet):
    model = Task
    serializer_class = TaskSerializer

Ну а затем самое главное, а именно урлы для работы с данными.

router = routers.DefaultRouter()
router.register(r'tasks', views.TaskViewSet)

urlpatterns = patterns('',
    url(r'^$', 'app.views.home', name='Home'),
    url(r'', include(router.urls)),
)

Далее добавим в базу несколько записей с которыми дальше будем работать.

[
    {'title': 'Begin write this posts', 'is_completed': 'true'},
    {'title': 'Go to the shops', 'is_completed': 'false'},
    {'title': 'Buy a new MacBook Pro', 'is_completed': 'false'}
]

Теперь можно проверить нашу модель и коллекцию в backbone приложении.

> var task = new App.Models.Task({id: 2});
> task.toJSON();
  Object {id: 2, title: "", is_completed: false}
> task.fetch();
> task.toJSON();
  Object {id: 2, title: "Go to the shops", is_completed: false}

> collections = new App.Collections.Tasks();
> collections.fetch();
> collections.toJSON();
  [Object, Object, Object]

Исходный код вы можете найти на гитхабе.