GItlab服務(wù)器配置

服務(wù)器基本配置和版本:
Ubuntu: 18.04.6 LTS
Linux: 5.4.0-150-generic
Gitlab: 12.9.2
服務(wù)器硬件配置(256線程AMD EPYC CPU、32G內(nèi)存、1T SSD + 10TB HDD)
帶寬:100M (有內(nèi)網(wǎng)限制)T-T
公司配置的就這樣, 只能在有限的條件下講究這用。 數(shù)據(jù)風(fēng)險(xiǎn)還是很高的。
建議:HDD --> SSD 、提高帶寬、備份數(shù)據(jù)(組建NAS或云存儲(chǔ)等)

1.相關(guān)命令:
# 查看端口占用情況
sudo netstat -tulnp | grep -E ':80|:443|:8080|:5432'
# 檢查磁盤(pán)空間
df -h
# 檢查內(nèi)存使用
free -h
# 清理舊日志或備份文件
sudo gitlab-ctl clean

# 查看版本詳情
gitlab-rake gitlab:env:info

# 查看當(dāng)前服務(wù)狀態(tài)
sudo gitlab-ctl status
# 檢查健康轉(zhuǎn)態(tài)
sudo gitlab-rake gitlab:check 

# 重啟某個(gè)組件---例如: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

# 回滾配置到默認(rèn)狀態(tài)(謹(jǐn)慎操作?。?sudo gitlab-ctl reconfigure --reset
2.配置項(xiàng)如下
## gitlab 版本為:12.9.2
## 服務(wù)器硬件配置(256線程AMD EPYC CPU、32G內(nèi)存、10TB HDD)


## 基礎(chǔ)配置-你的服務(wù)地址
external_url 'http://192.168.xx.xxx:80' 

## Unicorn/Puma 配置 用于處理Web請(qǐng)求
unicorn['enable'] = false
puma['enable'] = true
puma['worker_processes'] = 16  # 匹配單個(gè) NUMA 節(jié)點(diǎn)的物理核心數(shù)
puma['min_threads'] = 1
puma['max_threads'] = 16
puma['worker_timeout'] = 120
puma['per_worker_max_memory_mb'] = 1024  # 防止內(nèi)存泄漏

## 調(diào)整請(qǐng)求超時(shí)時(shí)間
gitlab_rails['max_request_duration_seconds'] = 57

## 前臺(tái)服務(wù) 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"


## 后臺(tái)服務(wù) Sidekiq 配置 
sidekiq['performance'] = true
sidekiq['metrics_enabled'] = true
sidekiq['shutdown_timeout'] = 60
sidekiq['concurrency'] = 25
sidekiq['max_concurrency'] = 50        # 根據(jù)任務(wù)類(lèi)型調(diào)整
sidekiq['min_concurrency'] = 25
sidekiq['queue_groups'] = ['*']        # 按實(shí)際隊(duì)列負(fù)載分配


## PostgreSQL 優(yōu)化
# 內(nèi)存相關(guān)優(yōu)化
postgresql['shared_buffers'] = "8GB"    # 總內(nèi)存的 25%
postgresql['work_mem'] = "128MB"
postgresql['maintenance_work_mem'] = "125MB"
# 工作進(jìn)程個(gè)數(shù)
postgresql['max_worker_processes'] = 16
postgresql['effective_cache_size'] = "24GB"   # 物理內(nèi)存的50%-75% 不實(shí)際分配內(nèi)存,只作為查詢(xún)優(yōu)化的依據(jù)
# 調(diào)整連接池大小
postgresql['max_connections'] = 500

## 網(wǎng)絡(luò)優(yōu)化
# 調(diào)整連接數(shù)
gitlab_rails['db_pool'] = 64
# 禁用IPV6
gitlab_rails['gitlab_shell_ssh_port'] = 22
gitlab_rails['gitlab_shell_git_timeout'] = 800

## 內(nèi)存緩存策略
gitlab_rails['env'] = {
  # 控制內(nèi)存碎片,風(fēng)險(xiǎn):若并發(fā)超過(guò)16 可能發(fā)生鎖競(jìng)爭(zhēng)。
  'MALLOC_ARENA_MAX' => 16,       
  # 控制垃圾回收,增大-內(nèi)存分配更激進(jìn),內(nèi)存占用快且高、減小-內(nèi)存受限且頻繁GC       
  'RUBY_GC_HEAP_GROWTH_MAX_SLOTS' => 400000, 
  # 默認(rèn)值10000ms,臟數(shù)據(jù)的回收。減少內(nèi)存占用,但會(huì)提高CPU開(kāi)銷(xiāo),自行平衡
  'MALLOC_CONF' => 'dirty_decay_ms:1000,muzzy_decay_ms:1000' 
}


## Redis 優(yōu)化
redis['enable'] = true
# 連接數(shù)優(yōu)化
redis['maxclients'] = "10000"
redis['maxmemory'] = "4GB"
redis['tcp_timeout'] = "60"
redis['tcp_keepalive'] = "300"
# 淘汰舊數(shù)據(jù) lru 算法
redis['maxmemory_policy'] = "allkeys-lru"
# 持久化優(yōu)化
redis['save'] = ["900 1", "300 100"]

## 匹配CPU線程數(shù) 使用與 gitlab 版本 13.4+
gitaly['enable'] = true
gitaly['concurrency'] = [
  {
    'rpc' => "/gitaly.SmartHTTPService/PostReceivePack", 
    'max_per_repo' => 64  # 每個(gè)倉(cāng)庫(kù)的 HTTP 推送并發(fā)限制
  },
  {
    'rpc' => "/gitaly.SSHService/SSHUploadPack", 
    'max_per_repo' => 32  # 每個(gè)倉(cāng)庫(kù)的 SSH 克隆并發(fā)限制
  },
  {
    'rpc' => "*",  # 通配符表示其他所有 RPC 方法
    'max_per_repo' => 16  # 默認(rèn)并發(fā)限制
  }
]

## 禁用監(jiān)控
prometheus_monitoring['enable'] = false
# 關(guān)閉一些監(jiān)控和性能基準(zhǔn)相關(guān)的功能
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.創(chuàng)建定時(shí)任務(wù)來(lái)清理并重啟git服務(wù)
1.創(chuàng)建維護(hù)腳本:(本腳本十分簡(jiǎn)單,根據(jù)自己的需求自行編寫(xiě)吧)
#!/bin/bash
# 新腳本路徑: /usr/local/bin/gitlab_maintenance.sh

# 配置部分
THRESHOLD_MEM=90      # 內(nèi)存使用率閾值
THRESHOLD_DISK=5     # 磁盤(pán)剩余空間百分比閾值
ADMIN_EMAIL="admin@example.com" # 報(bào)警接收郵箱

# 日志配置
LOG_DIR="/var/log/gitlab"
LOG_FILE="$LOG_DIR/maintenance.log"
MAX_LOG_SIZE="10M"  # 單個(gè)日志最大10MB


# 獲取內(nèi)存使用率(單位:%)
get_mem_usage() {
    free | awk '/Mem/ {printf("%.0f"), $3/$2 * 100}'
}


# 獲取根分區(qū)剩余空間(單位:%)
get_disk_usage() {
    df / | awk '/\// {print $5}' | sed 's/%//'
}

# 發(fā)送郵件
send_mail(){

    # 磁盤(pán)空間不足時(shí)發(fā)送郵件報(bào)警[6,7](@ref)
    if [ $((100 - disk_usage)) -le $THRESHOLD_DISK ]; then
        echo "[緊急] 磁盤(pán)剩余空間不足 ${THRESHOLD_DISK}%,發(fā)送報(bào)警郵件"
        mail -s "GitLab存儲(chǔ)告警" $ADMIN_EMAIL <<EOF
報(bào)警時(shí)間: $(date)
當(dāng)前狀態(tài):
$(df -h /)
$(free -h)
請(qǐng)立即處理!
EOF
        return 1  # 停止后續(xù)維護(hù)操作
    fi

}

# 維護(hù)操作
maintenance(){
    echo "========== 維護(hù)開(kāi)始: $(date) =========="
    gitlab-rake cache:clear
    gitlab-rake gitlab:cleanup:orphan_job_artifact_files DRY_RUN=0
    gitlab-ctl restart
    echo "========== 維護(hù)完成: $(date) =========="
}

# 檢查操作
query_current_status(){
    echo "********** 檢查開(kāi)始: $(date) **********"
    gitlab-ctl status
    echo "-------------------------------------------------------"
    gitlab-rake gitlab:check 
    echo "********** 檢查完成: $(date) **********"
}

# 自動(dòng)清理舊日志
find "$LOG_DIR" -name "maintenance.*.gz" -mtime +30 -delete

# 日志輪轉(zhuǎn)檢查
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

# 執(zhí)行維護(hù)操作
main(){
    local mem_usage=$(get_mem_usage)
    local disk_usage=$(get_disk_usage)
    
    echo "[$(date +'%F %T')] 系統(tǒng)檢測(cè):內(nèi)存使用率 ${mem_usage}%,磁盤(pán)空間使用率 ${disk_usage}%"
    
    # 內(nèi)存超閾值立即執(zhí)行維護(hù)[1,5](@ref)
    if [ $mem_usage -ge $THRESHOLD_MEM ]; then
        echo "[緊急] 內(nèi)存使用超過(guò)閾值 ${THRESHOLD_MEM}%,立即觸發(fā)維護(hù)流程"
        maintenance
    fi
    query_current_status
} 


main >> "$LOG_FILE" 2>&1
2.對(duì)生成的日志進(jìn)行滾動(dòng)存儲(chǔ):
## 新建配置文件 需要在控制臺(tái)中執(zhí)行
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

## 用于檢查定時(shí)任務(wù)和文件狀態(tài)
logrotate -vf /etc/logrotate.d/gitlab_maintenance
ls -lh /var/log/gitlab/maintenance*
3.創(chuàng)建定時(shí)任務(wù):
## 創(chuàng)建定時(shí)任務(wù) 
crontab -e

## 在文件中追加下一內(nèi)容
# 0 3 * * 0 = 每周日3:00 AM
# 格式說(shuō)明:分鐘(0) 小時(shí)(3) 日() 月() 周幾(0=周日)
0 3 * * 0 /usr/local/bin/gitlab_maintenance.sh

## 檢查是否添加成功
# crontab -l
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容