前面介紹了lxd,並詳細描述了使用lxd來搭建實驗室gpu共享伺服器方案,經過測試該方案完全可行。但是在最近的使用中坑了一把,lxc容器掛了,所有的容器都啟動不起來,於是開始了各種找問題。
因為啟動失敗log的資訊太少,而網上關於lxd的解決方案現在還是比較少的,google不到相關的解答,於是開始試錯。
經過各種配置測試:
取消gpu掛載
使用基礎映象啟動
使用預設配置啟動
發現使用預設配置能夠啟動所有容器,於是使用控制變數法乙個個排查自己插入的配置,最後發現nvidia.runtime: true
配置是導致容器啟動不起來的元凶,最終原因是因為在某次伺服器執行了apt upgrade
而更新了nvidia-container-runtime
,而lxd仍然保持這3.0.1
版本,不支援新版本的nvidia-container-runtime
,所以在配置了nvidia.runtime: true
之後,容器全部掛掉,啟動失敗。
發現問題,自然就好解決了,在lxd官網查到lxd最新版本已經是3.7.0
了,而目前apt
源上最新的版本是3.0.1
,新版本增加了比較多的對於 nvidia gpu 的支援與設定引數,考慮手動編譯lxd 3.7.0
。
snap中的lxd包版本:
# sudo snap find lxd
lxd-demo-server 0+git.f3532e3 stgraber - online software demo sessions using lxd
lxd 3.7 canonical✓ - system container manager and api
nova ocata james-page - openstack compute service (nova)
satellite 0.1.2 alanzanattadev - advanced scalable open source intelligence platform
nova-hypervisor ocata james-page - openstack compute service - kvm hypervisor (nova)
可以看到snap
中 lxd的版本為3.7,下面是使用安裝命令:
sudo apt install snap
snap install lxd
考慮到對於容器使用者的支援,更換了nvidia驅動和cuda版本,全部換成當前最新的版本,以支援使用者在容器中能夠跑起來最新的cuda版本(宿主機的驅動和cuda需要相容容器內的cuda版本)。同時使用一種更加簡單的方式來裝driver和cuda:
# 首先解除安裝當前cuda和驅動
sudo /usr/local/cuda-9.2/bin/uninstall_cuda_9.2.pl # 之前裝的cuda9.2
sudo
apt-get purge nvidia*
# 加入nvidia驅動源
sudo add-apt-repository ppa:graphics-drivers
sudo
apt-get update
# 查詢並安裝推薦版本(一般是最新穩定版)
ubuntu-drivers devices
sudo ubuntu-drivers autoinstall
# 安裝當前最新版本cuda10
wget
sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
sudo apt-key adv --fetch-keys
sudo
apt-get update
sudo apt install cuda
在初始化lxd和匯入模板映象之後(參考前文),容器啟動和執行一切正常。因為經過一段時間的測試,考慮到實際問題,給使用者更友好的環境,對共享方案進行了公升級。
之前是給使用者主機許可權,發現並不是很合適,決定不讓使用者接觸到主機層,直接通過埠對映將容器裡的22埠對映到主機上,讓使用者使用ssh遠端登陸容器進行操作從而完全規避主機。
lxd裡提供了命令來繫結容器與主機的埠,於是使用乙個簡單的指令碼來一鍵進行容器的建立和埠繫結:
# container_init.sh
##############
#/bin/bash
# $1 : name
# $2 : gpu select
# $3 : port
lxc init template $1 -p $2
lxc config device add $1 sshproxy proxy listen=tcp:0.0.0.0:$3 connect=tcp:localhost:22
lxc start $1
lxc exec
$1passwd root
這只是乙個簡單的指令碼,如果需要加入更多的功能可以根據具體情況新增,目前來說夠用了。 session共享方案
session 機制是一種伺服器端的機制,伺服器使用一種類似於雜湊表的結構來儲存資訊。session資訊預設是以檔案的形式儲存在服務端的。當程式需要為某個客戶端的請求建立乙個 session 的時候,伺服器首先檢查這個客戶端的請求 http request 裡是否已包含了乙個 session 標識 ...
Session 共享方案
一 什麼是分布式系統?分布式系統 旨在支援應用程式和服務的開發,可以利用物理架構由多個自治的處理元素組成,不共享記憶體,通過網路傳送訊息合作。分布式系統的三個特點 多節點,訊息通訊,不共享記憶體。二 什麼是session?廣義的session 指會話控制。由於http協議是無狀態的,對於不同http...
DV Arbiter驗證方案分享(續)
前言 前回分享了arbiter驗證的基本思想 link 下面做乙個推廣。並且提供一種使用generate來做assert和cover property的方法。一 round robin arbitor的驗證。對於乙個n輸入的round robin arbitor,需要用n個counter去統計回ac...