Performance 为什么我的hgweb服务器这么慢?

Performance 为什么我的hgweb服务器这么慢?,performance,mercurial,hgweb,Performance,Mercurial,Hgweb,我正在使用hgweb访问许多mercurial存储库,并将其作为一个集合提供: [collections] /home/me = /home/me/projects 这在localhost/projects中为它们提供服务 我在那个位置有大约30个存储库,在一个源代码树中,有相当数量的其他非mercurial管理的项目 hgweb的响应速度非常慢;在上提供一个列表大约需要30秒,打开一个项目大约需要30秒,这使得将此用于共享目的非常痛苦 我如何调整它以使其更快 我正在OSX上运行,如果它有区别

我正在使用hgweb访问许多mercurial存储库,并将其作为一个集合提供:

[collections]
/home/me = /home/me/projects
这在localhost/projects中为它们提供服务

我在那个位置有大约30个存储库,在一个源代码树中,有相当数量的其他非mercurial管理的项目

hgweb的响应速度非常慢;在上提供一个列表大约需要30秒,打开一个项目大约需要30秒,这使得将此用于共享目的非常痛苦

我如何调整它以使其更快


我正在OSX上运行,如果它有区别的话。

AFAIK,
hgweb
将扫描其配置文件中
[collections]
项的所有子目录。因为有很多非Mercurial目录,所以它必须扫描每个目录的每个子目录。相反,它可以在包含Mercurial存储库的目录树的顶层停止扫描,因为它将在那里看到
.hg
目录


如果您使用的是较新的Mercurial(1.1之后的版本),请尝试将
hgweb.config
更改为使用
[path]
部分,并为每个Mercurial存储库提供显式条目。

问题可能是服务器在每个请求期间递归搜索repo。听起来你有一个相当大的目录,所以这是有意义的

此符号将与首选的
[path]
属性一起使用,但我不确定它是否有助于
[collections]
属性。试着换成

[collections]
/home/me = /home/me/projects/*
所以它只会向下搜索一个级别

有关此问题的更多信息,请查看此处:


如果你改成
[路径]
并使用
*
符号,那肯定不行。

继尼尔非常有用的回答之后,我意识到我需要一个工具来维护这个[路径]部分。我最终使用了这个(M.Foord使用的)

#!/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()

此脚本由OS X的同类cron每15分钟运行一次,确保我的hgweb永远不会过时。

作为开源替代方案,您可以使用Rhodode,它是完全用Python编写的hgweb替代品

  • 有自己的中间件来处理mercurial协议请求每个请求都可以被记录和验证+线程性能不太可能达到hgweb
  • 即使在mercurial请求下,每个项目的读/写/管理访问的完全权限
  • mako模板允许您自定义应用程序的外观
  • diff注释和源代码都用pygments着色
  • mercurial分支图与yui-flot幂图
  • 用于执行用户/权限管理以及存储库管理的管理界面
  • mercurial web的其他设置(可从管理面板编辑!)还可管理路径、存档和远程消息
  • 备份脚本可以备份整个应用程序,并通过scp将其发送到所需位置
  • 在内置数据库中设置项目说明和信息,以方便进行非文件系统操作
  • 存储库代码的全文搜索
  • 添加了在推送/恢复管理时失效的缓存,以实现高性能和始终最新的数据
  • rss/atom提要、gravatar支持
  • 基于pylons 1.0/sqlalchemy

你试过改用
hgwebdir
吗?这就像一个符咒。我将为这个问题添加我自己的答案,其中包含一个管理这个[path]部分的脚本。