Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Chris RОтветов: 4

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

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

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

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

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

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

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

  • Вы пробовали вместо этого использовать hgwebdir? Amber 11.08.2010

performancemercurialhgweb

Ответы

Ответ 1 · рейтинг 5 · Niall C.

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

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

Ответ 2 · рейтинг 7 · marcinkuzminski

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

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

Ответ 3 · рейтинг 1 · Chris R

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

Ответ 4 · рейтинг 1 · jwsample

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

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

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы