前段時間看到一份代碼,小規模、低難度的一個應用,MVC用到極致,業務邏輯卻混成一團麻,應該是中了培訓班的毒。現在的程式員,大多是沒仔細讀過《現代操作系統》,沒看過編譯原理,不知道堆與棧,沒怎麼用過C、C++,上手就Java、C#,程式一開就記憶體狂飆,資料庫連接隨手就建,但這種人算是相當多了,見多了也 ...
前段時間看到一份代碼,小規模、低難度的一個應用,MVC用到極致,業務邏輯卻混成一團麻,應該是中了培訓班的毒。現在的程式員,大多是沒仔細讀過《現代操作系統》,沒看過編譯原理,不知道堆與棧,沒怎麼用過C、C++,上手就Java、C#,程式一開就記憶體狂飆,資料庫連接隨手就建,但這種人算是相當多了,見多了也就習慣了。
前兩天看到一篇文章,作者使用的是InterSystems的資料庫,這是一個美國公司,為醫療衛生行業提供重要的網路平臺,不少國外的IVD廠商都有用到。作者描述的問題很簡單:
伺服器相當的不穩定,每天都會宕機。
掛了的時候所有的程式都連接不上資料庫,大概過10分鐘左右又好了!
找來找去說是資料庫的License不夠了,所以不讓新的連接上來,那就納悶了。雖然Intersystem公司賣的License賊貴,一個就要十萬塊,但是通過加上ECP,基本上就多出來1000個License Units,咋還會不夠用呢?
首先,License 授權是個相當複雜的計算方式,拿 SQL Server 來說,SQL Server不同的版本有不同的功能,不僅價格頗有差異,獲得許可的方式也不盡相同,高的有1萬9千多刀,總的來說,有兩種基本的授權(License)模式。
一、“每處理器”或“每核”模式
“每處理器”(Per Processor)授權模式只計算物理處理器的數量,與物理處理器的內核數量無關。按“每核”(Per Core)計數,同時還需要計算物理處理器(插槽)的數量,單個插槽最低需要購買4核。
這一授權模式可以很好的簡化授權的複雜程度,不用統計有多少用戶(或者設備)會訪問SQL Server,以及是防火牆內部還是來自Internet的外部連接。
二、“Server+CAL”模式
CAL即客戶端訪問許可(Client Access License),分為設備訪問許可(Device CAL)和用戶訪問許可(User CAL)兩類。SQL Server及其組件(例如報表服務)提供服務,客戶端則是訪問這些服務的設備或用戶。
購買CAL時需要考慮有多少客戶端需要訪問SQL Server並從中獲取數據,客戶端的計算方式與中間層無關,只與最終有多少客戶端能夠獲取(包括瀏覽、修改、刪除數據等)SQL Server伺服器中的數據有關。
標準功能每客戶端大概940刀。
回到主題,作者在License Usage 裡面看到License Usage by User,同一個IP對應多個連接數但是UserID還是一樣的,也就是說你開N個連接或者程式,UserID都是相同的,而且都是同一IP地址,當然,用的License也就是一個,但是,你會發現原來它會計算Connections,也就是連接數。
問題來了:
If the number of processes exceeds this maximum, a transition occurs and Caché begins allocating one license unit per process for that user ID. The system presumes that if more than maxconn connections are associated with a user ID, multiple users are accessing Caché through an intermediary, (for example, a firewall system) so additional license units are required. Therefore, when the (maxconn + 1) process starts, the number of license units allocated to that user ID changes from one to (maxconn + 1). Processes started by the Job command are allocated against the process limit of the user ID invoking the Job command.
原來一個License的進程數或者連接數是有最大限制的,如果超過這個最大限制的話,那就變成了每個連接都使用給一個單獨License,難怪伺服器會爆掉了。
比如我這邊看最大連接數是25。
那就很少了,設備啟動時候的用Job函數增加的進程也算在內,如果我們在這臺電腦啟動多個介面那就占用了多個進程數量了,萬一多開幾個程式,那完了,就爆了。
為啥有這個規定呢?
可能是為了控制你不用路由器的,如果你用路由的話對公網的IP地址都是一樣,Cache就沒法判斷你到底有多少個終端了。
對於這種問題能怎麼辦呢,只能想辦法優化一下連接數了。
這裡要吐槽一下,國內的LIS廠家開發人員的水平跟互聯網公司差十萬八千里,當然,也可以推到DBA身上,因為99.99%的LIS廠家和大部分的醫院都沒有DBA。無論是內部開發還是第三方調用,都是一個用戶,完全不考慮安全性問題,或者也有考慮安全性的,就是不開放數據訪問,也不提供介面,逼第三方去想歪招;不過我已經看到有些LIS廠家已經開始提供WebService介面了,雖然沒有遵循ASTM協議或HL7協議,但也是一個進步。
回到最前面說到問題,小應用場景或開發環境下,該做的優化不做,如果遇到這樣的問題呢,總不能讓客戶花十萬買License,只有優化連接數了,優化、測試的時間成本呢,客戶的時間成本呢,或者客戶能等你改好嗎?