有利於提高xenomai 實時性的一些配置建議

来源:https://www.cnblogs.com/wsg1100/archive/2020/04/19/12730720.html
-Advertisement-
Play Games

本文講述一些有利於提高xenomai 實時性配置建議,其中,一些是通用的,一些是針對某個架構的,最後是xenomai實時性測試數據,希望對你有用。 一、影響因素 硬實時操作系統應具備的最重要特性之一是可預測性,系統應該保證滿足所有關鍵時序約束。然而,這取決於一系列因素,這些因素涉及硬體的架構特征、內 ...


本文講述一些有利於提高xenomai 實時性配置建議,其中,一些是通用的,一些是針對某個架構的,最後是xenomai實時性測試數據,希望對你有用。

一、影響因素

硬實時操作系統應具備的最重要特性之一是可預測性,系統應該保證滿足所有關鍵時序約束。然而,這取決於一系列因素,這些因素涉及硬體的架構特征、內核中採用的機制和策略,以及用於實現應用程式的編程語言。

1.硬體

硬體方面,第一個影響調度可預測性的是處理器本身。處理器的內部特性是不確定性的第一個原因,例如指令預取、流水線操作、高速緩存存儲器和直接存儲器訪問(DMA)機制。這些特性雖然改善了處理器的平均性能,但它們引入了非確定性因素,這些因素阻止了對最壞情況執行時間(WCET)的精確估計。

其他影響因素有記憶體、散熱。提升記憶體頻率可降低記憶體訪問延時;使用雙通道記憶體,這兩個記憶體CPU可分別定址、讀取數據,從而使記憶體的帶寬增加一倍,數據存取速度也相應增加一倍(理論上),記憶體訪問延時得到縮短,進而提升系統的實時性能;處理器散熱設計不好,溫度過高時會引發CPU降頻保護,系統運行頻率降低影響實時性,熱設計應確保在高工作量時的溫度不會引發降頻。

對於X86 CPU,雙通道記憶體性能是單通道記憶體的2. 5倍以上;正確的熱設計可使實時性提升1.4倍以上。

2.BISO(X86平臺)

BISO需要針對實時系統進行配置。優化的BIOS設置與使用預設BISO設置的實時性能差距高達9倍。

3.軟體

  • 操作系統:調度演算法,同步機制,信號量類型,記憶體管理策略,通信語義和中斷處理。

  • 資源的分配隔離:分配CPU專門對實時任務服務、將多餘中斷隔離到非實時任務CPU上,分配CPU專門對實時任務服務可使L1 、L2 Cache只為實時任務服務。

  • 實時任務的設計,良好的軟體設計能更好的發揮實時性能。

  • 其他,虛擬化、GUI等

4. 緩存使用策略與GPU

  • CPU 里的 L1 Cache 或者 L2 Cache,訪問延時是記憶體的 1/15 乃至 1/100,想要追求極限性能,需要儘可能地多從 CPU Cache 裡面拿數據,減少cache miss,上面的分配CPU專門對實時任務服務就是對非共用的L1 、L2 Cache的充分優化。對於L3 Cache,多個cpu核與GPU共用,無法避免非實時任務及GUI爭搶L3 Cache對實時任務的影響。為此intel 對Last Level Cache 推出了CAT(緩存分配技術,Cache Alocation Technology),對最後一級緩存(L3 Cache)實現分區,用戶可以通過限制每個核心能夠向其中分配緩存行的LLC數量,將LLC的部分分配給特定核心,使用該技術可以提升實時任務Cahe命中率,減少MSI延遲和抖動,進而提升實時性能。(不是所有intel處理器具有該功能)

  • GPU。硬體上GPU與CPU共用L3 Cache ,因此GUI會影響實時任務的實時性。intel建議根據GUI任務的工作負載來固定GPU的運行頻率,且頻率儘可能低。減小GPU對實時任務實時性的影響。

二、優化措施

1. BIOS[x86]

Disable Features Intela Hyper-Threading Technology.
Intel SpeedStep.
Intel Speed Shift Technology
C-States: Gfx RC6.
GT PM Support.
PCH Cross Throttling.
PCI Express* Clock Gating.
Delay Enable DMI ASPM,DMI Link ASPM Control.
PCle *ASPM and SATA Aggressive LPM Support.
(For Skylake and Kaby Lake, also consider disabling Gfx Low Power Mode and USB Periodic SMl in BIOS.)
Enable Features Legacy lO Low Latency
Gfx Frequency Set to fixed value as low as possible according to proper workload
Memory Frequency SA GV Fixed High

2. 硬體

除處理器外,記憶體方面,使用雙通道記憶體,儘可能高的記憶體頻率。

散熱當面,針對處理器工作負載設計良好的散熱結構。

3. Linux

xenomai基於linux,xenomai作為一個小的實時核存在,許多硬體配置是linux 驅動掌管的,必須讓linux配置好,給xenomai提供一個好的硬體環境。

3.1 Kernel CMDLINE

cpu隔離

多核情況下將CPU隔離,設置內核參數isolcpus=[cpu列表] ,將列表中的CPU從內核SMP平衡和調度演算法中剔除,將剔除的CPU用於RT應用。如4核CPU平臺將第3、4核隔離來做RT應用。

CPU編號從"0"開始,列表的表示方法有三種:
numA,numB,...,numN
numA-numN
以及上述兩種表示方法的組合:
numA,...,numM-numN
例如:isolcpus=0,3,4-7表示隔離CPU0、3、4、5、6、7.

GRUB_CMDLINE_LINUX="isolcpus=2,3"

以上只是linux不會調度普通任務到CPU2和3上運行,這是基礎,此時還需要設置xenomai方面的CPU隔離,方法一,任務通過函數pthread_attr_setaffinity_np()設置xenomai任務只在CPU3和4上調度。

cpu_set_t cpus;
CPU_ZERO(&cpus);
CPU_SET(2, &cpus);//將線程限制在指定的cpu2上運行
CPU_SET(3, &cpus);//將線程限制在指定的cpu3上運行
ret = pthread_attr_setaffinity_np(&tattr, sizeof(cpus), &cpus);

方法二,向xenomai設置內核參數supported_cpus,指定xenomai支持的CPU,xenomai任務會自動放到cpu2、cpu3上運行。

xenomai 內核參數supported_cpus與linux不同,supported_cpus是一個16進位數,每bit置位表示支持該CPU,要支持CPU2、CPU3,需要置置位bit2、bit3,即supported_cpus=0x06(00000110b)。

GRUB_CMDLINE_LINUX="isolcpus=2,3 xenomai.supported_cpus=0x06"

註:linux內核參數isolcpus=CPU編號列表是基礎,否則若不隔離linux任務,後面的xenomai設置將沒任何意義。

Full Dynamic Tick

將CPU2、CPU3作為xenomai使用後,由於xenomai調度是完全基於優先順序的調度器,並且我們已將linux任務從這兩個cpu上剔除,CPU上Tick也就沒啥用了,避免多餘的Tick中斷影響實時任務的運行,需要將這兩個cpu配置為Full Dynamic Tick模式,即關閉tick。通過添加linux內核參數nohz_full=[cpu列表] 配置。

nohz_full=[cpu列表]在使用CONFIG_NO_HZ_FULL = y構建的內核中才生效。

GRUB_CMDLINE_LINUX="isolcpus=2,3 xenomai.supported_cpus=0x06 nohz_full=2,3"

為什麼是linux內核參數呢?雙核下時間子系統中分析過,每個CPU的時鐘工作方式是linux初始化並配置工作模式的,xenomai最後只是接管而已,所以這裡是通過linux內核參數配置。

註意:boot CPU(通常是0號CPU)會無條件的從列表中剔除。這是一個坑~

start_kerel()
 ->tick_init()
 	->tick_nohz_init()
void __init tick_nohz_init(void)
{
 .......
 cpu = smp_processor_id();
	
	if (cpumask_test_cpu(cpu, tick_nohz_full_mask)) {
		pr_warn("NO_HZ: Clearing %d from nohz_full range for timekeeping\n",
			cpu);
		cpumask_clear_cpu(cpu, tick_nohz_full_mask);
	}
 ......
}
Offload RCU callback

從引導選擇的CPU上卸載RCU回調處理,使用內核線程 “rcuox / N”代替,通過linux內核參數rcu_nocbs=[cpu列表]指定的CPU列表設置。這對於HPC和實時工作負載很有用,這樣可以減少卸載RCU的CPU上操作系統抖動。

"rcuox / N",N表示CPU編號,‘x’:'b'是RCU-bh的b,'p'是RCU-preempt,‘s’是RCU-sched。

rcu_nocbs=[cpu列表]在使用CONFIG_RCU_NOCB_CPU=y構建的內核中才生效。除此之外需要設置RCU內核線程rcuc/nrcub/n線程的SCHED_FIFO優先順序值RCU_KTHREAD_PRIO,RCU_KTHREAD_PRIO設置為高於最低優先順序線程的優先順序,也就是說至少要使該優先順序低於xenomai實時應用的優先順序,避免xenomai實時應用遷移到linux後,由於優先順序低於RCU_KTHREAD的優先順序而實時性受到影響,如下配置RCU_KTHREAD_PRIO=0。

General setup  --->
    RCU Subsystem  --->
        (0) Real-time priority to use for RCU worker threads
        [*] Offload RCU callback processing from boot-selected CPUs 
            (X) No build_forced no-CBs CPUs
            ( ) CPU 0 is a build_forced no-CBs CPU
            ( ) All CPUs are build_forced no-CBs CPUs
GRUB_CMDLINE_LINUX="isolcpus=2,3 xenomai.supported_cpus=0x06 nohz_full=2,3 rcu_nocbs=2,3"
中斷隔離

多核情況下,通過內核參數irqaffinity==[cpu列表],設置linux中斷的親和性,設置後,預設由這些cpu核來處理非CPU綁定中斷。避免linux中斷影響cpu2、cpu3上的實時應用,將linux中斷指定到cpu0、cpu1處理。

GRUB_CMDLINE_LINUX="isolcpus=2,3 xenomai.supported_cpus=0x06 nohz_full=2,3 rcu_nocbs=2,3 irqaffinity=0,1"

以上只是設置linux中斷的affinity,只能使運行實時任務的CPU2、cpu3不會收到linux非CPU綁定中斷請求。

要指定cpu來處理xenomai實時設備中斷,需要在實時驅動代碼中通過函數xnintr_affinity()設置,綁定實時驅動中斷由CPU2、CPU3處理代碼如下。

    cpumask_t irq_affinity;
    ...
    cpumask_clear(&irq_affinity);
    cpumask_set_cpu(2, &irq_affinity);
    cpumask_set_cpu(3, &irq_affinity);
    ...
    if (!cpumask_empty(&irq_affinity)){
    	xnintr_affinity(&pIp->irq_handle,irq_affinity);	/*設置實時設備中斷的affinity*/
    }

雖然ipipe會保證xenomai 實時中斷在任何CPU都會優先處理,在實時設備中斷比較少的場合,我覺得把linux中斷與實時中斷分開比較好;如果實時設備中斷數量較多,如果隔離就會造成實時中斷間相互影響中斷處理的實時性,這時候不指定實時中斷處理CPU比較好。

禁用irqbanlance

irqbalance 用於優化中斷分配,它會自動收集系統數據以分析使用模式,並依據系統負載狀況將工作狀態置於 Performance mode 或 Power-save mode。簡單來說irqbalance 會將硬體中斷分配到各個CPU核心上處理。

  • 處於 Performance mode 時,irqbalance 會將中斷儘可能均勻地分發給各個 CPU core,以充分利用 CPU 多核,提升性能。
  • 處於 Power-save mode 時,irqbalance 會將中斷集中分配給第一個 CPU,以保證其它空閑 CPU 的睡眠時間,降低能耗。

禁用irqbanlance,避免不相干中斷發生在RT任務核。發行版不同,配置方式不同,以Ubuntu為例,停止/關閉開機啟動如下。

systemctl stop irqbalance.service
systemctl disable irqbalance.service

必要的話直接卸載irqbalance。

apt-get remove irqbalance

x86平臺還可添加參數acpi_irq_nobalance 禁用ACPI irqbalance.

GRUB_CMDLINE_LINUX="isolcpus=2,3 xenomai.supported_cpus=0x06 nohz_full=2,3 rcu_nocbs=2,3 irqaffinity=0,1 acpi_irq_nobalance noirqbalance"
intel 核顯配置[x86]

主要針對intel CPU的核顯,配置intel核顯驅動模塊i915,內核參數如下。

GRUB_CMDLINE_LINUX="i915.enable_rc6=0 i915.enable_dc=0 i915.disable_power_well=0  i915.enable_execlists=0 i915.powersave=0"
nmi_watchdog[x86]

NMI watchdog是Linux的開發者為了debugging而添加的特性,但也能用來檢測和恢復Linux kernel hang,現代多核x86體系都能支持NMI watchdog。

NMI(Non Maskable Interrupt)即不可屏蔽中斷,之所以要使用NMI,是因為NMI watchdog的監視目標是整個內核,而內核可能發生在關中斷同時陷入死迴圈的錯誤,此時只有NMI能拯救它。

Linux中有兩種NMI watchdog,分別是I/O APIC watchdog(nmi_watchdog=1)和Local APIC watchdog(nmi_watchdog=2)。它們的觸發機制不同,但觸發NMI之後的操作是幾乎一樣的。一旦開啟了I/O APIC watchdog(nmi_watchdog=1),那麼每個CPU對應的Local APIC的LINT0線都關聯到NMI,這樣每個CPU將周期性地接到NMI,接到中斷的CPU立即處理NMI,用來悄悄監視系統的運行。如果系統正常,它啥事都不做,僅僅是更改 一些時間計數;如果系統不正常(預設5秒沒有任何普通外部中斷),那它就閑不住了,會立馬跳出來,且中止之前程式的運行。該出手時就出手。

避免周期中斷的NMI watchdog影響xenomai實時性需要關閉NMI watchdog,傳遞內核參數nmi_watchdog=0.

GRUB_CMDLINE_LINUX="isolcpus=2,3 xenomai.supported_cpus=0x06 nohz_full=2,3 rcu_nocbs=2,3 irqaffinity=0,1 acpi_irq_nobalance noirqbalance i915.enable_rc6=0 i915.enable_dc=0 i915.disable_power_well=0  i915.enable_execlists=0 i915.powersave=0 nmi_watchdog=0"
nosoftlockup

linux內核參數,禁用 soft-lockup檢測器。

GRUB_CMDLINE_LINUX="isolcpus=2,3 xenomai.supported_cpus=0x06 nohz_full=2,3 rcu_nocbs=2,3 irqaffinity=0,1 acpi_irq_nobalance noirqbalance i915.enable_rc6=0 i915.enable_dc=0 i915.disable_power_well=0  i915.enable_execlists=0 i915.powersave=0 nmi_watchdog=0 nosoftlockup"
CPU特性[x86]

intel處理器相關內核參數:

  • nosmap
  • nohalt。告訴內核在空閑時,不要使用省電功能PAL_HALT_LIGHT。 這增加了功耗。但它減少了中斷喚醒延遲,這可以提高某些環境下的性能,例如聯網伺服器或實時系統。
  • mce=ignore_ce,忽略machine checkerrors (MCE).
  • idle=poll,不要使用HLT在空閑迴圈中進行節電,而是輪詢以重新安排事件。 這將使CPU消耗更多的功率,但對於在多處理器基準測試中獲得稍微更好的性能可能很有用。 它還使使用性能計數器的某些性能分析更加準確。
  • clocksource=tsc tsc=reliable,指定tsc作為系統clocksource.
  • intel_idle.max_cstate=0 禁用intel_idle並回退到acpi_idle.
  • processor.max_cstate=0 intel.max_cstate=0 processor_idle.max_cstate=0 限制睡眠狀態c-state。
GRUB_CMDLINE_LINUX="isolcpus=2,3 xenomai.supported_cpus=0x06 nohz_full=2,3 rcu_nocbs=2,3 irqaffinity=0,1 acpi_irq_nobalance noirqbalance i915.enable_rc6=0 i915.enable_dc=0 i915.disable_power_well=0  i915.enable_execlists=0 i915.powersave=0 nmi_watchdog=0 nosoftlockup processor.max_cstate=0 intel.max_cstate=0 processor_idle.max_cstate=0     intel_idle.max_cstate=0 clocksource=tsc tsc=reliable nmi_watchdog=0 nosoftlockup intel_pstate=disable idle=poll nohalt nosmap  mce=ignore_ce"

3.2 內核構建配置

系統構建時,除以上提到的配置外(CONFIG_NO_HZ_FULL = y、CONFIG_RCU_NOCB_CPU=y、RCU_KTHREAD_PRIO=0),其他實時性相關配置如下:

CONFIG_MIGRATION=n、CONFIG_MCORE2=y[x86]、CONFIG_PREEMPT=y、ACPI_PROCESSOR =n[x86]、CONFIG_CPU_FREQ =n、CONFIG_CPU_IDLE =n;

經過以上配置後可以使用latency測試,觀察配置前後的變化。關於latency,需要註意的是,測試timer-IRQ的latency時,即用latency -t2命令來測試時,xenomai預設使用cpu0的timer,上面提到boot CPU(通常是0號CPU)會無條件的從nohz_full=[cpu列表]列表中剔除,所以latency -t2測試時你會發現沒什麼變化,還可能會變差了(最壞情況差不多一致,平均值變大了),另外我們將linux中斷affinity全都設置為CPU0處理,這些中斷或多或少也會影響timer-IRQ的latency。

三、實時性能測試

筆者對以上各個條件配置前後對比了實時性改善效果,均有不同程度的優化效果,在此就不一一貼出前後對比圖了,大家有興趣可自行測試。
下麵直接給出最終的應用空間任務實時性測試結果,使用的環境如下:

CPU intel 賽揚 [email protected]
Kernel Linux 4.4.200
操作系統 Ubuntu 16.04
記憶體 8GB DDR3-1600 雙通道
存儲 64GB EMMC

測試條件:在stress壓力下測試,同時一個QT應用程式繪製2維曲線圖,QT CPU占用率99%。

stress -c 10 -m 4

測試時間:211:04:55
測試命令:

latency -t0 -p 100 -P 99 -h -g result.txt 

測試應用空間程式,優先順序99,任務周期100us,測試結果輸出到文件result.txt。經過接近10天的測試後,文件result.txt中latency分佈結果如下:

# 211:04:55 (periodic user-mode task, 100 us period, priority 99)
# ----lat min|----lat avg|----lat max|-overrun|---msw|
#       0.343|      1.078|     23.110|       0|     0|
# Xenomai version: Xenomai/cobalt v3.1
# Linux 4.4.200-xeno 
......
# I-pipe releagese #20 detected
# Cobalt core 3.1 detected
# Compiler: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 
# Build args: --enable-smp --enable-pshared --enable-tls 
PKG_CONFIG_PATH=:/usr/xenomai/lib/pkgconfig:/usr/xenomai/lib/pkgconfig0 1
0.5 1599357037
1.5 1621130106
2.5 56618753
3.5 4386985
4.5 3848531
5.5 3556704
6.5 3353649
7.5 3033218
8.5 2560133
9.5 2035075
10.5 1516866
11.5 1038989
12.5 680815
13.5 417124
14.5 224296
15.5 115165
16.5 58075
17.5 27669
18.5 11648
19.5 4648
20.5 1646
21.5 467
22.5 38
23.5 1

其中第一列數據表示latency的值,第二列表示該值與上一個值之間這個範圍的latency出現的次數(測試時間太長數據已溢出),最小0.343us,平均latency 1.078us,最大23.110us。可見xenomai的實時性還是挺不錯的。
以上是xenomai應用空間任務的實時性表現,如果使用內核空間任務會更好。當然這隻能說明操作系統能提供的實時性能,具體的還要看應用程式的設計等

相關鏈接

https://www.intel.com/content/dam/www/public/us/en/documents/white-papers/cache-allocation-technology-white-paper.pdf


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 通常說到變數,可能就是指的用戶自定義的變數,但是Shell中變數的概念除了用戶自定義變數,還包括環境變數、系統預定義變數、位置參數變數、數值變數等。 用戶自定義變數註意用戶自定義變數只在當前的shell終端中生效。自定義變數:變數名稱可以使用字母、數字和下劃線組成,但是不能以數字開頭。變數類型:Ba ...
  • Shell概述一方面,Shell相當於一個命令解釋器,將Linux命令解釋為二進位機器碼,或者反過來,將二進位機器碼解釋為Linux命令。其實我們啟動Linux後命令交互界面就是系統給用戶提供的一個Shell解釋器的界面。另一方面,Shell也是一種解釋執行的腳本編程語言,並且在Shell中可以直接 ...
  • 搜索命令 whereis which locate find whereis 英文原意:locate the binary,source,and manual page files for a command 功能:查找二進位命令、源文件和幫助文檔的命令 語法:where 選項[ bm] 命令 wh ...
  • 本文記一些比較零碎的系統操作,如將程式放入後臺,查看進程和記憶體等信息,查看系統Linux內核和版本等信息,以及如何制定系統定時任務等。 將程式放入後臺在Windows程式中其實最小化之後就是放入後臺運行了,在Linux系統中有兩種方式將程式放入後臺。方式一:在命令的最後加一個&符即可將命令的運行放入 ...
  • Windows中可以通過任務管理器來查看對應的進程信息以及系統資源等信息,Linux中則通常使用“ps aux”來查看這些信息。 查看所有進程和系統資源ps aux或ps -le:查看所有進程即系統資源的使用,前者使用的是BSD操作系統格式,即Unix系統格式,a表示前臺進程,u表示創建該進程的用戶 ...
  • Linux中對於許可權的管理是非常嚴格的,不同的用戶可以擁有不同的操作許可權,其中超級管理員root是最大的,幾乎擁有所有的許可權,如果你是root用戶,即使你想把系統給刪了也是允許的,所以經常有“rm -rf /*”的玩笑或段子,但也確實需要小心,使用rm -rf命令的時候不要刪錯東西了。常用的許可權操作 ...
  • Linux運維工程師的首要職責就是保證業務7 x 24小時穩定的運行,監控Web伺服器對於查看網站上發生的情況至關重要。關註最多的便是日誌變動,查看實時日誌文件變動大家第一反應應該是'tail -f /path/to/log'命令吧,但是如果每個網站的訪問日誌都是使用這種方式查看也是相當崩潰的,今天 ...
  • 深度操作系統(DEEPIN)是武漢深之度科技有限公司致力於為全球用戶提供美觀易用、安全可靠的Linux發行版。經過一段時間的測試,這款操作系統的Beta版終於今天和大家見面了。這次Deepin v20操作系統帶來了全新的Deepin桌面和全家桶軟體,基於Linux 5.3內核,並宣佈將永久免費使用。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...