港鐵四線冧檔 (下集)

I.T. 9 遊戲日誌
4 min readDec 19, 2018

--

IT9你走唔甩㗎喇

上次講到,可能係Realtime System再加Loading導致,可能開機要Sync嘅State太多所以Boot唔起,今日有新聞開估啦。

港鐵調查稱前線不懂重置信號系統 按機制罰$800萬

…當計數器達到上限數值時,便須重置。……Siemens的計數器則須人手重置。當日事故主因,是2個聯繫信號系統的軟件計數器,因重置安排不同,令區間電腦重複執行重置動作,令電腦不穩定,最終維修人員要隔離並重置各站的區間電腦,才能修復信號系統。…

…Siemens信號系統的計數器,每隔約20年,便達到上限數值,須手動重置…

港鐵廿年一遇四線冧檔

乜嘢係計數器?

報導冇講計數器係指乜,首先應該係指Counter,等我又估下 :D,基於:

  • 每隔約20年要重置
  • 重置時要隔離

20年×365.25日×86400秒 — 大概是2³¹~2³²之間,可能唔係咁啱每秒遞增?但咁樣講都肯定係一個不斷自增長(Auto-increment)嘅數字Counter。

重置時要隔離,即係指呢一個Counter同其他區間電腦互通信息時會用到。好可能係當收到一個Message,個Counter值比自己嘅大,就會將自己提到跟Message Counter一樣?所以如果唔係同一刻reboot,就會不斷爆返上去個極限值。

西門子套SACEM係1996年引入嘅,啱啱廿年鬆啲第一次爆,如果早一年換咗新系統都可以避開。

係唔係抵死?

至於爆Counter,爆Integer呢啲嘢,做IT都應該唔會覺得奇,個個System或大或小都可能有啲類似嘅嘢。

POSIX Time

例如UNIX以及Linux等符合POSIX嘅電腦內部時鐘,其實裏面係一個數字,個數字代表由1970–01–01 00:00:00Z (即Unix Epoch)至今有多少秒,而家呢一刻係1545222627左右。呢個數字到咗2038年1月,就會超出2³¹亦係Signed 32-bit Integer表示極限,2038問題將會同千年蟲差唔多。

我哋呢十幾年新增嘅電腦系統應該多過2000年之前,有幾多個係兼容到2038年?自x86有咗64-bit,其實各x86-64嘅OS Kernel都已經用64-bit Integer去儲存呢個秒數,但今日新寫嘅軟件都未必會好特別注意呢個問題,到時世界末唔末日?馬會真係可以開個盤口。

Idempotent API

通訊嘅嘢,講到底即係API,而眾所周知API應該要設計到幂等(idempotent)。實作上即係如果Call緊API中途斷線,若API係幂等嘅,caller用可以同一組Input再call一次而唔使擔心有副作用。

最簡單嘅做法,就係每個Message跟一個自增Counter數值,而接收方檢查一下每個Message嘅Counter係唔係最新,就可以避免到重覆執行。

港鐵呢單嘢,可能同呢樣有關?

Database

SQL DB Primary key用Auto increment/Sequence/Identity好常見㗎啦,Integer爆咗嘅話……咪會爆囉。

除此之外,有名Open Source RDBMS之一嘅PostgreSQL,喺7.2版或之前,即係2005年左右,Transaction ID (XID)都有極限問題 — 每2³²個Transactions就要dump+restore DB一次先可以解決。7.3或之後版本先變咗自動重置。但如果有人手多多熄咗auto-vacuum,一樣會爆鑊。

噉係唔係抵死?

廿年唔一遇嘅嘢,話「前線不懂重置信號系統」我覺得又過份咗少少。問題唔只係Reboot就解決到,前線亦唔係唔識Reboot,而要隔離哂區間電腦加埋Reboot先解決到。

我9估啦又,隔離咗就一定有Trade off嘅。可能係某啲列車狀態、路軌狀態,某啲指令過唔到去?至於係會導致行車班次唔可以咁密,定對安全性有影響,就要問港鐵啦。

即係抵唔抵死?

20年前嘅系統用32-bit Integer都幾情有可願嘅,1993年Unicode委員會以為16-bit就可以裝哂所有字添

衰就衰作為一個Safety-critical system,西門子冇喺說明書提過呢個問題,都幾澤使。但願個系統都真係fail safe啦,唔好好似高鐵噉single fault就炒車

--

--

I.T. 9 遊戲日誌
I.T. 9 遊戲日誌

Written by I.T. 9 遊戲日誌

「IT9,你的資訊真的很有用」 你好 我就係IT9 Trust me I am IT9 // fb@it9gamelog, youtube@it9gamelog

No responses yet