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

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

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

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

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

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

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

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


person Chris R    schedule 10.08.2010    source источник
comment
Вы пробовали вместо этого использовать hgwebdir?   -  person Amber    schedule 11.08.2010


Ответы (4)


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

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

person Niall C.    schedule 10.08.2010
comment
Это работает как шарм. Я собираюсь добавить свой собственный ответ на этот вопрос, который содержит скрипт, управляющий этим разделом [paths]. - person Chris R; 12.08.2010

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

  • имеет собственное промежуточное программное обеспечение для обработки запросов протокола mercurial, каждый запрос может быть зарегистрирован и аутентифицирован + многопоточная производительность маловероятна для hgweb
  • полные разрешения на чтение/запись/администрирование проекта даже по запросу mercurial
  • Шаблоны mako позволяют настраивать внешний вид приложения.
  • различает аннотации и исходный код, окрашенные пигментами.
  • граф ветвей mercurial и графы с питанием от yui-flot
  • интерфейс администратора для выполнения управления пользователями/разрешениями, а также управления репозиторием.
  • Дополнительные настройки для mercurial web (хуки редактируются из панели администратора!), а также управление путями, архивом, удаленными сообщениями.
  • сценарии резервного копирования могут выполнять резервное копирование всего приложения и отправлять его через scp в нужное место.
  • настроить описания проекта и информацию внутри встроенной базы данных для простых операций без файловой системы
  • Полный текст поиска по кодам репозиториев
  • добавлен кеш с аннулированием при управлении push/repo для высокой производительности и всегда актуальных данных.
  • rss/atom каналы, поддержка gravatar
  • на основе пилонов 1.0/sqlalchemy
person marcinkuzminski    schedule 20.08.2010

Следуя очень полезному ответу Найла выше, я понял, что мне нужен инструмент для поддержки этого раздела [пути]. В итоге я остановился на этом (который использует 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()

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

person Chris R    schedule 12.08.2010

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

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

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

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

Подробнее об этой проблеме читайте здесь: https://www.mercurial-scm.org/wiki/HgWebDirStepByStep

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

person jwsample    schedule 10.08.2010