刷卡機(jī)的區(qū)域代碼對(duì)不對(duì)
網(wǎng)上關(guān)于刷卡機(jī)的區(qū)域代碼對(duì)不對(duì)的刷卡知識(shí)比較多,也有關(guān)于刷卡機(jī)的區(qū)域代碼對(duì)不對(duì)的問(wèn)題,今天第一pos網(wǎng)(www.keemji.com)為大家整理刷卡常見(jiàn)知識(shí),未來(lái)的我們終成一代卡神。
本文目錄一覽:
1、刷卡機(jī)的區(qū)域代碼對(duì)不對(duì)
刷卡機(jī)的區(qū)域代碼對(duì)不對(duì)
排查不一樣的問(wèn)題,往往會(huì)有不一樣的難點(diǎn)。有的問(wèn)題難在重現(xiàn),但只要能重現(xiàn)一次,那么問(wèn)題就會(huì)迎刃而解;有的問(wèn)題難在調(diào)試,比如排查一個(gè)刷卡機(jī)內(nèi)的SD卡,通過(guò)數(shù)據(jù)線連接到電腦上出現(xiàn)文件系統(tǒng)不可見(jiàn)的問(wèn)題。這可能需要研究刷卡機(jī)嵌入式操作系統(tǒng),和桌面操作系統(tǒng)的文件系統(tǒng),存儲(chǔ)系統(tǒng),以及設(shè)備管理三層的實(shí)現(xiàn),才能最終定位到問(wèn)題。
對(duì)于阿里云技術(shù)支持的同學(xué)來(lái)說(shuō),還有另外一種比較特別的技術(shù)難題。這類(lèi)問(wèn)題的難度來(lái)源于客戶的堅(jiān)持:當(dāng)我們的客戶對(duì)一個(gè)我們自己看起來(lái)無(wú)關(guān)緊要的問(wèn)題盤(pán)根問(wèn)底的時(shí)候,這個(gè)問(wèn)題就會(huì)變得非常棘手。今天就跟大家分享一例這樣的問(wèn)題。
是誰(shuí)動(dòng)了我的Cpu資源!
首先我簡(jiǎn)單解釋一下客戶所看到的問(wèn)題。如下圖第三行,top統(tǒng)計(jì)Cpu總體使用情況,使用了八個(gè)指標(biāo)。這八個(gè)指標(biāo)分別是,用戶空間進(jìn)程(us),內(nèi)核空間進(jìn)程(sy),高nice值的用戶空間進(jìn)程(ni),空閑(id),空閑等待io(wa),中斷上半部(hi),中斷下半部(si),以及steal時(shí)間(st)。理論上來(lái)講這八個(gè)指標(biāo)之和,應(yīng)該是100%。這八個(gè)指標(biāo)當(dāng)中,id和wa是Cpu空閑時(shí)間的統(tǒng)計(jì),這兩個(gè)值之和越小,說(shuō)明Cpu越忙碌。客戶這臺(tái)服務(wù)器的id與wa之和是0,所以這臺(tái)服務(wù)器的Cpu使用率是100%,其中占比最大的是ni。
除了第三行Cpu總體統(tǒng)計(jì)指標(biāo)之外,top會(huì)對(duì)Cpu的使用率,從進(jìn)程維度上進(jìn)行統(tǒng)計(jì),也就是CPU這一列。因?yàn)檫@臺(tái)服務(wù)器是16核的,所以每個(gè)進(jìn)程(多線程)的Cpu使用率可以超過(guò)100%,同時(shí)所有進(jìn)程Cpu使用率之和不能超過(guò)上線1600%(平均到每個(gè)核是100%)。
這個(gè)問(wèn)題的“見(jiàn)鬼”之處在于,雖然這個(gè)系統(tǒng)里運(yùn)行著787個(gè)進(jìn)程,但這些進(jìn)程使用Cpu之和,卻遠(yuǎn)小于1600%這個(gè)值。
晴天霹靂:?jiǎn)栴}現(xiàn)場(chǎng)丟失
剛準(zhǔn)備深入探究這個(gè)問(wèn)題的時(shí)候,不幸的事情發(fā)生了。客戶這臺(tái)機(jī)器重啟了。重啟之后問(wèn)題消失!雖然問(wèn)題現(xiàn)場(chǎng)丟失了,但客戶的質(zhì)疑沒(méi)有改變。客戶強(qiáng)烈要求我們提供這臺(tái)服務(wù)器Cpu打滿的原因。
備注:很多時(shí)候,我們?cè)谟龅诫y以解釋的問(wèn)題的時(shí)候,往往傾向于把問(wèn)題歸結(jié)到和這個(gè)問(wèn)題相關(guān)的“黑盒”的部分。這也是為什么,很多客戶在遇到不容易解釋的現(xiàn)象的時(shí)候,會(huì)懷疑原因在虛擬化層,或在物理機(jī)層,有時(shí)候甚至?xí)岩砂⒗镌频漠a(chǎn)品是不是“缺斤短兩”了。
nice!
作為技術(shù)支持工程師,在沒(méi)有重現(xiàn)環(huán)境的情況下,為了滿足客戶的需求,我這邊做的第一件事情是,搞清楚ni這個(gè)指標(biāo)的計(jì)算方法,跟客戶溝通這個(gè)指標(biāo)背后的理論知識(shí),然后期望客戶能夠理解,這個(gè)指標(biāo)跟物理機(jī)沒(méi)有任何關(guān)系,純粹是虛擬機(jī)內(nèi)部行為。
nice是什么
在第一部分,我介紹Cpu八個(gè)統(tǒng)計(jì)指標(biāo)的時(shí)候,提到了ni是高nice值的用戶空間進(jìn)程的Cpu使用率。nice值是什么呢,簡(jiǎn)單來(lái)講,nice值代表著一個(gè)進(jìn)程使用Cpu資源的優(yōu)先程度。每個(gè)進(jìn)程都會(huì)有一個(gè)與之對(duì)應(yīng)的nice值,nice值越高,那么這個(gè)進(jìn)程使用Cpu的優(yōu)先級(jí)就越低,獲得的處理器的時(shí)間相比較而言就會(huì)越少。而ni這個(gè)指標(biāo),統(tǒng)計(jì)的是系統(tǒng)中,所有nice值大于0的用戶空間進(jìn)程的Cpu的使用率。
一般情況下進(jìn)程默認(rèn)的nice值是0,而當(dāng)有些進(jìn)程需要更高的執(zhí)行優(yōu)先級(jí)的時(shí)候,我們會(huì)減小這些進(jìn)程的nice值。當(dāng)然有一些并不需要在高優(yōu)先級(jí)運(yùn)行的進(jìn)程,例如我們跑編譯程序gcc,去編譯一個(gè)內(nèi)核,這個(gè)操作預(yù)計(jì)會(huì)花幾個(gè)小時(shí),那么我們可以增加這個(gè)gcc進(jìn)程的nice值。
linux會(huì)把真正的用戶模式Cpu使用率拆分成兩部分顯示,nice值大于0的顯示為ni,小于等于0的顯示為us。
自己動(dòng)手跑高ni
這里我們做一個(gè)簡(jiǎn)單的測(cè)試去驗(yàn)證上邊的理論。我們使用for語(yǔ)句寫(xiě)一個(gè)簡(jiǎn)單的死循環(huán)程序loop,然后用objdump看代碼編譯之后的匯編程序。這段匯編非常簡(jiǎn)單,前兩行準(zhǔn)備堆棧指針;第三行初始化一個(gè)變量,這個(gè)變量位于堆棧上rpb-0x4這個(gè)位置;然后第四第五行重復(fù)遞增這個(gè)變量。
00000000004004ed <main>:
4004ed: 55 push %rbp
4004ee: 48 89 e5 mov %rsp,%rbp
4004f1: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp)
4004f8: 83 45 fc 01 addl $0x1,-0x4(%rbp)
4004fc: eb fa jmp 4004f8 <main+0xb>
4004fe: 66 90 xchg %ax,%ax
loop進(jìn)程一旦被調(diào)度到一個(gè)Cpu上,那么這個(gè)Cpu就會(huì)被打滿。如下兩張圖,左邊是nice值為0的情況,右邊是nice值為19的情況。進(jìn)程nice值可以在圖下邊NI這一列看到。
下邊是Cpu使用率拆分到每個(gè)核上的情況。
不滿意的客戶
我跟客戶溝通ni這個(gè)指標(biāo)背后的理論知識(shí)和我的結(jié)論:這個(gè)問(wèn)題和物理機(jī)沒(méi)有什么關(guān)系。對(duì)于我的結(jié)論,客戶是不接受的。客戶強(qiáng)調(diào),在機(jī)器重啟之前,他檢查了系統(tǒng)里所有進(jìn)程的Cpu的使用情況,他非常確定沒(méi)有發(fā)現(xiàn)任何異常。雖然當(dāng)時(shí)系統(tǒng)里有一百多個(gè)java進(jìn)程,但是這些java進(jìn)程的Cpu使用率都非常低。
時(shí)間大法,好!
以前處理系統(tǒng)夯機(jī)問(wèn)題的時(shí)候,偶爾會(huì)走投無(wú)路。想象一下,一個(gè)復(fù)雜的系統(tǒng)中,運(yùn)行著上千甚至上萬(wàn)的進(jìn)程。而夯機(jī)則意味著,系統(tǒng)里的這些進(jìn)程,像一團(tuán)亂麻一樣,糾纏在了一起。這個(gè)時(shí)候,只有從這些進(jìn)程中整理出依賴關(guān)系,才能知道哪些進(jìn)程是夯機(jī)問(wèn)題的trouble maker,而哪些進(jìn)程又是夯機(jī)問(wèn)題的受害者。理清這些關(guān)系,大部分情況下,我們是靠理清資源的持有與等待關(guān)系。
可惜的是,這種分析方法并不是萬(wàn)能的。系統(tǒng)為了節(jié)省管理成本,只會(huì)有選擇的維護(hù)其中某些資源的持有與等待關(guān)系。
在我們不能用這種方法分析問(wèn)題的時(shí)候,另外一種方法就派上了用場(chǎng)。這種方法就是分析進(jìn)程進(jìn)入等待狀態(tài)的先后順序。我們稱(chēng)這種方法叫“時(shí)間大法”。
挖礦程序
在因?yàn)闊o(wú)法重現(xiàn)問(wèn)題而“走投無(wú)路”的時(shí)候,“時(shí)間大法”給了我希望。首先,在sa日志里我找到了Cpu達(dá)到100%的開(kāi)始時(shí)間是4月29日凌晨6點(diǎn)40。接著,我翻遍了系統(tǒng)里幾乎所有的文件,發(fā)現(xiàn)有兩個(gè)配置文件在6點(diǎn)39被創(chuàng)建。而存放這兩個(gè)配置文件的目錄,則有兩個(gè)非常可疑的庫(kù)文件libxmr-stak-c.a和libxmr-stak-backend.a。Google這兩個(gè)文件,發(fā)現(xiàn)這是門(mén)羅幣挖礦程序使用的名字。
還是不滿意的客戶
當(dāng)把上邊的發(fā)現(xiàn)同步給客戶的時(shí)候,客戶還是覺(jué)得證據(jù)不足。而且客戶再次強(qiáng)調(diào),他當(dāng)時(shí)看了所有系統(tǒng)里運(yùn)行的進(jìn)程,如果有可疑的進(jìn)程使用Cpu異常的話,他肯定早發(fā)現(xiàn)了。因?yàn)榭蛻舻膱?jiān)持,壓力再次回到了我們這一邊。
隱藏linux進(jìn)程方法一二三
如果客戶所說(shuō)的是真實(shí)情況的話,那么有什么方法可以隱藏linux進(jìn)程,讓客戶不能從ps或top的輸出中,讀到進(jìn)程信息呢?比較常用的三種方法是:創(chuàng)建進(jìn)程的時(shí)候,把pid設(shè)置成為0;直接修改ps和top代碼;或者h(yuǎn)ook libc里readdir和opendir等函數(shù)(因?yàn)閜s和top的實(shí)現(xiàn),直接使用了readdir和opendir等libc庫(kù)函數(shù),來(lái)讀取/proc文件及其子目錄)。
這個(gè)時(shí)候我突然想起自己之前曾經(jīng)看到過(guò)的,在6點(diǎn)39被更改的另外一個(gè)文件ld.so.preload。第一次檢查這個(gè)文件的時(shí)候,看到這個(gè)文件里被寫(xiě)了一條libjdk.so,想當(dāng)然的以為這個(gè)文件和java有關(guān),所以忽略了這條信息。
我知道事情的真相了!
這個(gè)時(shí)候,事情的全貌就顯現(xiàn)出來(lái)了。在6點(diǎn)39分,有人給ld.so.preload增加了一個(gè)庫(kù)文件。從那以后,所有的進(jìn)程,啟動(dòng)的時(shí)候都會(huì)首先加載這個(gè)庫(kù),然后再加載其他庫(kù)。這就產(chǎn)生一個(gè)效果,如果進(jìn)程調(diào)用一個(gè)外部函數(shù),這個(gè)函數(shù)的實(shí)現(xiàn)本來(lái)在其他庫(kù)文件里,但是這個(gè)預(yù)先加載的庫(kù)實(shí)現(xiàn)了同樣的函數(shù),那么動(dòng)態(tài)鏈接會(huì)先使用預(yù)先加載的這個(gè)庫(kù)里定義的這個(gè)函數(shù)。
記得上一次使用這個(gè)技巧的時(shí)候,還是多年前在寫(xiě)opengl trace工具的時(shí)候。后來(lái)轉(zhuǎn)投微軟系,linux上這些技巧就淡忘了。基本上來(lái)說(shuō),使用ld.so.preload,我們可以實(shí)現(xiàn)filter類(lèi)工具,在filter工具中實(shí)現(xiàn)過(guò)濾,追蹤,參數(shù)檢查等功能。當(dāng)然為了保證進(jìn)程正常運(yùn)行,我們的同名過(guò)濾函數(shù),最終還是會(huì)調(diào)用原來(lái)的函數(shù)。
驗(yàn)證了一下,系統(tǒng)里所有的進(jìn)程,因?yàn)橹貑ⅲ技虞d了libjdk這個(gè)庫(kù)文件到自己的地址空間里。下圖是讀bash進(jìn)程/proc/<pid>/maps內(nèi)容的輸出。
libjdk的雕蟲(chóng)小技
這個(gè)庫(kù)libjdk和java沒(méi)有什么關(guān)系,他非常小,實(shí)現(xiàn)也非常簡(jiǎn)單。以致于我們甚至可以通過(guò)讀匯編來(lái)理解它的行為。就如之前猜測(cè)的一樣,這個(gè)庫(kù)hook了readdir之類(lèi)的函數(shù),對(duì)讀取/proc文件夾的操作做了過(guò)濾,所以客戶在使用top或者ps命令的時(shí)候,得到的結(jié)果都是被過(guò)濾過(guò)的結(jié)果。這里不會(huì)對(duì)libjdk匯編代碼進(jìn)行深入分析,但是提供一個(gè)strings輸出的這個(gè)庫(kù)文件里包含的串。從這些串中,我們也能對(duì)這個(gè)庫(kù)的行為猜個(gè)大概。
后記
回顧這個(gè)問(wèn)題的處理過(guò)程,憑良心講,這個(gè)問(wèn)題本來(lái)并不算是什么疑難雜癥。可能抓個(gè)core dump,分分鐘就能搞定。但兩件事情極大的增加了這個(gè)問(wèn)題的排查難度,一個(gè)是問(wèn)題環(huán)境丟失,一個(gè)是客戶的堅(jiān)持。
當(dāng)然如果不是問(wèn)題環(huán)境丟失,那么我也不會(huì)去嘗試其他的排查思路,如果不是客戶的堅(jiān)持,我也不會(huì)做到把匯編代碼都拿出來(lái)做證據(jù)的這種程度。客戶的高要求,不斷的敦促,是我們不斷提升服務(wù)能力的重要驅(qū)動(dòng)力。
以上就是關(guān)于刷卡機(jī)的區(qū)域代碼對(duì)不對(duì)的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于刷卡機(jī)的區(qū)域代碼對(duì)不對(duì)的知識(shí),希望能夠幫助到大家!

轉(zhuǎn)載請(qǐng)帶上網(wǎng)址:http://www.keemji.com/shuakatwo/209221.html