Почему мой сервер hgweb настолько медленный?

Я обслуживаю доступ к множеству ртутных репозиториев, используя hgweb, предоставляя их как коллекцию:

[collections]
/home/me = /home/me/projects

Это обслуживает их в localhost/projects

У меня есть около 30 репозиториев в этом месте, в исходном дереве с множеством других проектов, не связанных с использованием мерки.

hgweb очень медленно реагирует; требуется около 30 секунд, чтобы предоставить листинг в http://localhost/ и около 30 секунд, чтобы открыть проект, из-за чего больно использовать это для совместного использования целей.

Как я могу настроить это, чтобы сделать его быстрее?

Я работаю на OSX, если это имеет значение.

4 ответа

AFAIK, hgweb сканирует все подкаталоги записи [collections] в своем файле конфигурации. Поскольку у вас есть много несерьюриальных каталогов, он должен выполнять проверку каждого подкаталога каждого из них. Напротив, он может остановить сканирование на верхнем уровне дерева каталогов, содержащего репозиторий Mercurial, потому что он увидит там каталог .hg.

Если вы используете новый Mercurial (после версии 1.1, это похоже), попробуйте заменить hgweb.config на использование раздела [paths] и предоставить явные записи для каждого из репозиториев Mercurial.


В качестве альтернативы с открытым исходным кодом вы можете использовать RhodeCode http://rhodecode.com его замену hgweb, полностью написанную на Python.

  • имеет свое собственное промежуточное программное обеспечение для обработки запросов протокола Mercurial. Каждый запрос может быть зарегистрирован и аутентифицирован + производительность с потоком, маловероятная для hgweb.
  • полные разрешения на доступ к проекту для чтения/записи/администрирования даже по запросу по запросу.
  • Шаблоны mako позволяют настраивать внешний вид приложения.
  • diffs аннотации и исходный код, все цветные выражениями.
  • График ртутной ветки и графики с графиком yui-флота
  • интерфейс администратора для управления пользователями/разрешениями, а также управления репозиториями.
  • Дополнительные настройки для меркуриального Интернета (крючки, редактируемые с панели администратора!) также управляют путями, архивами, удаленными сообщениями
  • сценарии резервного копирования могут выполнять резервное копирование всего приложения и отправлять его по scp в нужное место.
  • описания и описание проектов проекта внутри встроенного db для упрощения операций без файловой системы.
  • Текст полного поиска по кодам репозитория
  • добавлен кеш с недействительностью при управлении push/repo для высокой производительности и всегда до даты.
  • rss/atom feeds, поддержка gravatar
  • на основе пилонов 1.0/sqlalchemy


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

Эта нотация будет работать с предпочтительным атрибутом [paths], но я не уверен, поможет ли это атрибуту [collections]. Попробуйте перейти на

[collections]
/home/me = /home/me/projects/*

поэтому он будет искать только один уровень вниз.

Подробнее здесь: https://www.mercurial-scm.org/wiki/HgWebDirStepByStep

Если это не работает, это определенно будет, если вы перейдете на [paths] и используйте нотацию *.


Следуя за Найл, очень полезный ответ, выше, я понял, что мне нужен инструмент для поддержки этого раздела [путей]. Я закончил с этим (который использует configobj М. Фоорда.

#!/usr/bin/env python
from __future__ import print_function
import os
from configobj import ConfigObj
hgweb_path = os.path.join(os.path.expanduser("~"), "Library", "Preferences", "hgweb.config")
projects = os.path.join(os.path.expanduser("~"), "projects")
config = ConfigObj(hgweb_path)
paths = []
def add_mercurial(arg, dirname, names):
 if '.hg' in names:
 paths.append(dirname[len(projects) + 1:])
os.path.walk(projects, add_mercurial, None)
config['paths'] = {}
for path in paths:
 config['paths']["projects/" + path] = os.path.join(projects, path)
config.write()

Этот script запускается эквивалентом cron OS X каждые 15 минут и гарантирует, что мой hgweb никогда не устанет.

licensed under cc by-sa 3.0 with attribution.