服务器基本配置和版本:
Ubuntu: 18.04.6 LTS
Linux: 5.4.0-150-generic
Gitlab: 12.9.2
服务器硬件配置(256线程AMD EPYC CPU、32G内存、1T SSD + 10TB HDD)
带宽:100M (有内网限制)T-T
公司配置的就这样, 只能在有限的条件下讲究这用。 数据风险还是很高的。
建议:HDD --> SSD 、提高带宽、备份数据(组建NAS或云存储等)
1.相关命令:
# 查看端口占用情况
sudo netstat -tulnp | grep -E ':80|:443|:8080|:5432'
# 检查磁盘空间
df -h
# 检查内存使用
free -h
# 清理旧日志或备份文件
sudo gitlab-ctl clean
# 查看版本详情
gitlab-rake gitlab:env:info
# 查看当前服务状态
sudo gitlab-ctl status
# 检查健康转态
sudo gitlab-rake gitlab:check
# 重启某个组件---例如:redis 、 postgresql
# 重启 Redis
sudo gitlab-ctl restart redis
# 重启 PostgreSQL
sudo gitlab-ctl restart postgresql
# 重置 GitLab
sudo gitlab-ctl cleanse
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
# 回滚配置到默认状态(谨慎操作!)
sudo gitlab-ctl reconfigure --reset
2.配置项如下
## gitlab 版本为:12.9.2
## 服务器硬件配置(256线程AMD EPYC CPU、32G内存、10TB HDD)
## 基础配置-你的服务地址
external_url 'http://192.168.xx.xxx:80'
## Unicorn/Puma 配置 用于处理Web请求
unicorn['enable'] = false
puma['enable'] = true
puma['worker_processes'] = 16 # 匹配单个 NUMA 节点的物理核心数
puma['min_threads'] = 1
puma['max_threads'] = 16
puma['worker_timeout'] = 120
puma['per_worker_max_memory_mb'] = 1024 # 防止内存泄漏
## 调整请求超时时间
gitlab_rails['max_request_duration_seconds'] = 57
## 前台服务 Nginx 配置
nginx['enable'] = true
nginx['worker_connections'] = 4096
nginx['worker_processes'] = 64
nginx['keepalive_timeout'] = 65
nginx['client_max_body_size'] = '1024m'
nginx['gzip'] = "on"
## 后台服务 Sidekiq 配置
sidekiq['performance'] = true
sidekiq['metrics_enabled'] = true
sidekiq['shutdown_timeout'] = 60
sidekiq['concurrency'] = 25
sidekiq['max_concurrency'] = 50 # 根据任务类型调整
sidekiq['min_concurrency'] = 25
sidekiq['queue_groups'] = ['*'] # 按实际队列负载分配
## PostgreSQL 优化
# 内存相关优化
postgresql['shared_buffers'] = "8GB" # 总内存的 25%
postgresql['work_mem'] = "128MB"
postgresql['maintenance_work_mem'] = "125MB"
# 工作进程个数
postgresql['max_worker_processes'] = 16
postgresql['effective_cache_size'] = "24GB" # 物理内存的50%-75% 不实际分配内存,只作为查询优化的依据
# 调整连接池大小
postgresql['max_connections'] = 500
## 网络优化
# 调整连接数
gitlab_rails['db_pool'] = 64
# 禁用IPV6
gitlab_rails['gitlab_shell_ssh_port'] = 22
gitlab_rails['gitlab_shell_git_timeout'] = 800
## 内存缓存策略
gitlab_rails['env'] = {
# 控制内存碎片,风险:若并发超过16 可能发生锁竞争。
'MALLOC_ARENA_MAX' => 16,
# 控制垃圾回收,增大-内存分配更激进,内存占用快且高、减小-内存受限且频繁GC
'RUBY_GC_HEAP_GROWTH_MAX_SLOTS' => 400000,
# 默认值10000ms,脏数据的回收。减少内存占用,但会提高CPU开销,自行平衡
'MALLOC_CONF' => 'dirty_decay_ms:1000,muzzy_decay_ms:1000'
}
## Redis 优化
redis['enable'] = true
# 连接数优化
redis['maxclients'] = "10000"
redis['maxmemory'] = "4GB"
redis['tcp_timeout'] = "60"
redis['tcp_keepalive'] = "300"
# 淘汰旧数据 lru 算法
redis['maxmemory_policy'] = "allkeys-lru"
# 持久化优化
redis['save'] = ["900 1", "300 100"]
## 匹配CPU线程数 使用与 gitlab 版本 13.4+
gitaly['enable'] = true
gitaly['concurrency'] = [
{
'rpc' => "/gitaly.SmartHTTPService/PostReceivePack",
'max_per_repo' => 64 # 每个仓库的 HTTP 推送并发限制
},
{
'rpc' => "/gitaly.SSHService/SSHUploadPack",
'max_per_repo' => 32 # 每个仓库的 SSH 克隆并发限制
},
{
'rpc' => "*", # 通配符表示其他所有 RPC 方法
'max_per_repo' => 16 # 默认并发限制
}
]
## 禁用监控
prometheus_monitoring['enable'] = false
# 关闭一些监控和性能基准相关的功能
prometheus['enable'] = false
#prometheus_monitoring['enable'] = false
alertmanager['enable'] = false
node_exporter['enable'] = false
postgres_exporter['enable'] = false
pgbouncer_exporter['enable'] = false
gitlab_exporter['enable'] = false
grafana['enable'] = false
redis_exporter['enable'] = false
# sidekiq['metrics_enabled'] = false
3.创建定时任务来清理并重启git服务
1.创建维护脚本:(本脚本十分简单,根据自己的需求自行编写吧)
#!/bin/bash
# 新脚本路径: /usr/local/bin/gitlab_maintenance.sh
# 配置部分
THRESHOLD_MEM=90 # 内存使用率阈值
THRESHOLD_DISK=5 # 磁盘剩余空间百分比阈值
ADMIN_EMAIL="admin@example.com" # 报警接收邮箱
# 日志配置
LOG_DIR="/var/log/gitlab"
LOG_FILE="$LOG_DIR/maintenance.log"
MAX_LOG_SIZE="10M" # 单个日志最大10MB
# 获取内存使用率(单位:%)
get_mem_usage() {
free | awk '/Mem/ {printf("%.0f"), $3/$2 * 100}'
}
# 获取根分区剩余空间(单位:%)
get_disk_usage() {
df / | awk '/\// {print $5}' | sed 's/%//'
}
# 发送邮件
send_mail(){
# 磁盘空间不足时发送邮件报警[6,7](@ref)
if [ $((100 - disk_usage)) -le $THRESHOLD_DISK ]; then
echo "[紧急] 磁盘剩余空间不足 ${THRESHOLD_DISK}%,发送报警邮件"
mail -s "GitLab存储告警" $ADMIN_EMAIL <<EOF
报警时间: $(date)
当前状态:
$(df -h /)
$(free -h)
请立即处理!
EOF
return 1 # 停止后续维护操作
fi
}
# 维护操作
maintenance(){
echo "========== 维护开始: $(date) =========="
gitlab-rake cache:clear
gitlab-rake gitlab:cleanup:orphan_job_artifact_files DRY_RUN=0
gitlab-ctl restart
echo "========== 维护完成: $(date) =========="
}
# 检查操作
query_current_status(){
echo "********** 检查开始: $(date) **********"
gitlab-ctl status
echo "-------------------------------------------------------"
gitlab-rake gitlab:check
echo "********** 检查完成: $(date) **********"
}
# 自动清理旧日志
find "$LOG_DIR" -name "maintenance.*.gz" -mtime +30 -delete
# 日志轮转检查
if [ -f "$LOG_FILE" ] && [ $(stat -c %s "$LOG_FILE") -gt $((10 * 1024 * 1024)) ]; then
mv "$LOG_FILE" "$LOG_DIR/maintenance.$(date +%Y%m%d%H%M).log"
gzip "$LOG_DIR/maintenance.$(date +%Y%m%d%H%M).log"
fi
# 执行维护操作
main(){
local mem_usage=$(get_mem_usage)
local disk_usage=$(get_disk_usage)
echo "[$(date +'%F %T')] 系统检测:内存使用率 ${mem_usage}%,磁盘空间使用率 ${disk_usage}%"
# 内存超阈值立即执行维护[1,5](@ref)
if [ $mem_usage -ge $THRESHOLD_MEM ]; then
echo "[紧急] 内存使用超过阈值 ${THRESHOLD_MEM}%,立即触发维护流程"
maintenance
fi
query_current_status
}
main >> "$LOG_FILE" 2>&1
2.对生成的日志进行滚动存储:
## 新建配置文件 需要在控制台中执行
sudo tee /etc/logrotate.d/gitlab_maintenance <<EOF
/var/log/gitlab/maintenance.log {
weekly
missingok
rotate 4
compress
delaycompress
notifempty
create 0640 root root
size 10M
}
EOF
## 用于检查定时任务和文件状态
logrotate -vf /etc/logrotate.d/gitlab_maintenance
ls -lh /var/log/gitlab/maintenance*
3.创建定时任务:
## 创建定时任务
crontab -e
## 在文件中追加下一内容
# 0 3 * * 0 = 每周日3:00 AM
# 格式说明:分钟(0) 小时(3) 日() 月() 周几(0=周日)
0 3 * * 0 /usr/local/bin/gitlab_maintenance.sh
## 检查是否添加成功
# crontab -l