雙路物理CPU機器上安裝Ubuntu并部署KVM以實現系統多開

在雙路物理CPU機器上安裝Ubuntu并部署KVM以實現系統多開,并追求性能最優,需要從硬件、宿主機系統、KVM配置、虛擬機配置等多個層面進行優化。

以下是詳細的操作指南和優化建議:

階段一:BIOS/UEFI 設置優化 (重啟進入)

  1. 啟用虛擬化技術:

    • Intel CPU: Intel VT-x (Virtualization Technology)

    • AMD CPU: AMD-V (SVM - Secure Virtual Machine)

    • 通常在 CPU Configuration 或 Advanced Settings 中。

  2. 啟用 IOMMU (Input/Output Memory Management Unit):

    • Intel CPU: Intel VT-d (Virtualization Technology for Directed I/O)

    • AMD CPU: AMD-Vi

    • 這對于PCI設備直通 (passthrough) 非常重要,能顯著提升某些VM的I/O性能。

  3. 禁用不必要的設備:

    • 如果某些板載設備(如串口、并口、不用的聲卡)VM用不到,可以在BIOS中禁用,以釋放中斷資源。

  4. 內存設置:

    • 確保內存運行在支持的最高頻率。

    • 如果支持,啟用NUMA (Non-Uniform Memory Access)。雙路CPU幾乎必然是NUMA架構。

  5. 電源管理:

    • 將電源管理配置文件設置為 "高性能" (High Performance) 或類似選項。避免節能模式降低CPU頻率。

    • 禁用C-states (CPU idle states) 或者使用?intel_idle.max_cstate=0?或?processor.max_cstate=0?內核參數(后續宿主機優化中會提到),以減少CPU喚醒延遲,但會增加功耗。需要權衡。

階段二:Ubuntu Server 安裝

  1. 選擇最新LTS版本:?推薦使用最新的Ubuntu Server LTS版本(如22.04 LTS),以獲得較新的內核和KVM/QEMU版本,通常包含性能改進和新特性。

  2. 最小化安裝:?選擇 "Minimal installation" 或只安裝必要的核心組件,避免不必要的軟件包和服務消耗資源。

  3. 磁盤分區:

    • OS盤:?建議使用SSD,分配足夠的空間給?/?(根目錄) 和?/boot。

    • VM存儲盤:

      • 高性能方案:?使用高速NVMe SSD或SSD RAID陣列。

      • 大容量方案:?可以使用HDD RAID,但性能會遠低于SSD。

      • 分區策略:

        • LVM (Logical Volume Manager):?推薦使用LVM管理VM存儲,方便動態調整、快照等。在LVM上創建邏輯卷來存放VM鏡像。

        • 單獨分區:?也可以直接使用單獨的分區(如?/var/lib/libvirt/images?掛載到獨立的高速磁盤分區)。

    • Swap分區:?如果物理內存充足(例如64GB+),可以設置較小的Swap(如4-8GB)或不設置,依賴物理內存。如果內存可能緊張,適當設置Swap。

階段三:KVM及相關工具安裝

sudo apt update
sudo apt upgrade -y# 安裝KVM及管理工具
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager cpu-checker# 檢查KVM是否可用
sudo kvm-ok
# 輸出應包含 "KVM acceleration can be used"# 將當前用戶添加到libvirt和kvm組,以便無需sudo管理VM
sudo adduser $(whoami) libvirt
sudo adduser $(whoami) kvm
# 注意:需要重新登錄或重啟使組更改生效# 啟動并設置libvirtd服務開機自啟
sudo systemctl enable --now libvirtd
sudo systemctl status libvirtd

content_copydownload

Use code?with caution.Bash

階段四:宿主機系統性能優化

  1. CPU調速器 (CPU Governor):

    • 將其設置為?performance?模式,讓CPU以最高頻率運行。

    sudo apt install cpufrequtils -y
    echo 'GOVERNOR="performance"' | sudo tee /etc/default/cpufrequtils
    sudo systemctl disable ondemand # 如果存在
    sudo systemctl restart cpufrequtils # 或重啟系統
    # 驗證
    cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

    content_copydownload

    Use code?with caution.Bash
  2. NUMA優化:?雙路CPU系統是NUMA架構,優化NUMA至關重要。

    • 安裝NUMA工具:

      sudo apt install numactl -y

      content_copydownload

      Use code?with caution.Bash
    • 查看NUMA拓撲:

      numactl --hardware
      lscpu | grep NUMA

      content_copydownload

      Use code?with caution.Bash
    • 綁定服務到NUMA節點:?盡量將libvirtd服務和相關的qemu-system-*進程綁定到特定的NUMA節點,或者至少讓它們均勻分布。通常libvirtd自身不需要嚴格綁定,但它啟動的QEMU進程(即VM)需要。

    • IRQ平衡:?確保irqbalance服務運行,它會嘗試將硬件中斷分配到不同的CPU核心,避免單核瓶頸。

      sudo systemctl enable --now irqbalance

      content_copydownload

      Use code?with caution.Bash

      對于高性能網絡和存儲,有時需要手動調整IRQ親和性,將特定設備的IRQ綁定到VM vCPU所在的NUMA節點的CPU核心上。

  3. 內核參數優化 (GRUB):

    • 編輯?/etc/default/grub?文件,修改?GRUB_CMDLINE_LINUX_DEFAULT?行。

    • 常用參數:

      • intel_iommu=on?或?amd_iommu=on?(如果BIOS中已啟用,這里可以再次確認或強制啟用,對PCI直通重要)

      • isolcpus=<cpu_list>: 隔離部分CPU核心專門給VM使用,宿主機不調度普通進程到這些核心。需要仔細規劃,例如將某些核心完全留給特定高性能VM。

      • nohz_full=<cpu_list>: 針對isolcpus指定的CPU核心禁用內核時鐘滴答,減少VM抖動。

      • rcu_nocbs=<cpu_list>: 減少RCU回調對隔離CPU的干擾。

      • transparent_hugepage=never?或?transparent_hugepage=madvise:

        • never: 完全禁用透明大頁,手動為VM配置靜態大頁 (HugePages) 性能更好。

        • madvise: 僅在應用程序通過madvise()請求時使用THP,是一個折中。

        • 對于KVM,如果打算使用靜態HugePages,則應禁用THP。

      • elevator=noop?或?elevator=none?(對于SSD/NVMe): 設置I/O調度器為?noop?(或?none?for NVMe),因為SSD有自己的內部調度邏輯。

        • 也可以通過udev規則設置:?echo noop > /sys/block/sdX/queue/scheduler

    • 示例:
      GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on transparent_hugepage=never elevator=none"

    • 更新GRUB后生效:

      sudo update-grub
      sudo reboot

      content_copydownload

      Use code?with caution.Bash
  4. HugePages (靜態大頁):

    • 減少TLB (Translation Lookaside Buffer) miss,提高內存密集型應用性能。

    • VM內存應配置為使用HugePages。

    • 計算所需大頁數量:?(VM總內存 / HugePage大小)。常見HugePage大小為2MB或1GB。

      # 查看支持的HugePage大小
      cat /proc/meminfo | grep Hugepagesize
      # 假設Hugepagesize: 2048 kB (2MB)
      # 如果要給VM分配32GB內存,需要 32 * 1024 / 2 = 16384 個2MB大頁
      # 預留 (在 /etc/sysctl.conf 或 .conf 文件中)
      # sudo sysctl -w vm.nr_hugepages=16384
      # 或在啟動時通過內核參數:hugepages=16384
      # 永久生效:
      echo "vm.nr_hugepages=16384" | sudo tee -a /etc/sysctl.conf
      sudo sysctl -p

      content_copydownload

      Use code?with caution.Bash
    • 確保在VM的XML配置中啟用HugePages。

  5. 網絡優化:

    • 使用橋接網絡 (Bridged Networking):?virsh net-define,?virsh net-start,?virsh net-autostart?或使用?virt-manager?創建。橋接提供接近物理網絡的性能,VM像獨立主機一樣在局域網中。

    • vhost-net:?確保啟用。KVM默認會使用vhost-net,它將網絡包處理移到內核空間,減少上下文切換,提高性能。

      lsmod | grep vhost_net # 應該能看到模塊加載

      content_copydownload

      Use code?with caution.Bash
    • SR-IOV (Single Root I/O Virtualization):?如果網卡和主板支持,這是網絡性能的極致。它允許物理網卡虛擬出多個VF (Virtual Function),直接分配給VM,VM擁有近乎獨占的網卡硬件資源。配置較復雜。

階段五:虛擬機 (VM) 創建與優化

使用?virt-manager?(圖形化) 或?virsh?(命令行) 創建和管理VM。以下是優化點,主要通過編輯VM的XML配置文件 (virsh edit <vm_name>) 實現。

  1. CPU配置 (<vcpu>,?<cputune>):

    • CPU模式 (<cpu mode='...' ...>):

      • host-passthrough: 將宿主機CPU特性完整透傳給VM,通常性能最好,但VM遷移可能受限于目標主機的CPU型號。

      • host-model: 模擬宿主機CPU型號,提供較好的性能和一定的遷移兼容性。

      • 避免使用通用CPU型號 (如?qemu64,?kvm64),除非為了最大化遷移兼容性。

    • vCPU數量 (<vcpu placement='static' current='X'>X</vcpu>):?按需分配,不要過度分配。current屬性設為與最大vcpu數一致。

    • CPU釘扎/親和性 (<vcpupin>):

      • 關鍵優化!?將VM的vCPU綁定到宿主機的特定物理核心上,特別是綁定到同一NUMA節點的核心上。

      • 避免VM的vCPU在不同NUMA節點的物理核心間遷移,這會導致嚴重的性能下降。

      • 示例 (假設VM有2個vCPU,要綁定到物理CPU 0和1):

        <cputune><vcpupin vcpu="0" cpuset="0"/><vcpupin vcpu="1" cpuset="1"/><!-- 如果有更多vCPU和物理核心,繼續添加 -->
        </cputune>

        content_copydownload

        Use code?with caution.Xml
    • NUMA感知 (<numatune>):

      • 將VM的內存也分配到其vCPU所在的NUMA節點上。

      • 示例 (VM內存分配到宿主機NUMA節點0):

        <numatune><memory mode="strict" nodeset="0"/><!-- 如果VM本身也模擬NUMA,則需要更復雜的配置 -->
        </numatune>

        content_copydownload

        Use code?with caution.Xml
      • 如果VM本身也需要模擬NUMA架構(例如,大型數據庫VM),則需要更細致的配置,將VM的虛擬NUMA節點映射到宿主機的物理NUMA節點。

        <cpu ...><numa><cell id='0' cpus='0-1' memory='2048' unit='MiB'/> <!-- VM的NUMA節點0用vCPU 0-1,2GB內存 --><!-- ... --></numa>
        </cpu>
        <numatune><memnode cellid='0' mode='strict' nodeset='0'/> <!-- VM節點0的內存來自宿主機節點0 -->
        </numatune>

        content_copydownload

        Use code?with caution.Xml
  2. 內存配置 (<memory>,?<memoryBacking>):

    • 分配大小:?按需分配。

    • HugePages:

      <memoryBacking><hugepages/>
      </memoryBacking>

      content_copydownload

      Use code?with caution.Xml

      確保宿主機已配置足夠的HugePages。

    • 內存鎖定 (<locked/>):?防止VM內存被交換到磁盤。

      <memoryBacking><hugepages/><locked/>
      </memoryBacking>

      content_copydownload

      Use code?with caution.Xml
  3. 磁盤I/O優化 (<disk>):

    • 磁盤總線 (<disk type='file' device='disk'> <driver name='qemu' type='...' cache='...' io='...'/> ... </disk>):

      • virtio-blk: 傳統的半虛擬化塊設備,性能不錯。

      • virtio-scsi: 更現代,支持更多SCSI特性(如TRIM/UNMAP),通常推薦用于SSD。需要?<controller type='scsi' model='virtio-scsi'/>。

    • 鏡像格式 (type):

      • raw: 性能最好,無額外開銷,但不支持快照、動態擴展等特性。

      • qcow2: 功能豐富(快照、寫時復制、壓縮、加密),但有性能開銷。

        • 優化qcow2:

          • preallocation=metadata?或?preallocation=falloc?(創建時預分配,減少碎片)。

          • lazy_refcounts=on?(新版本qemu)。

    • 緩存模式 (cache):

      • none: 宿主機不緩存,VM直接訪問存儲,適合VM內部有良好緩存機制或數據庫等應用。通常是SSD的最佳選擇。

      • writethrough: 寫操作同時寫入宿主機緩存和物理磁盤,數據安全,但寫入慢。

      • writeback: 寫操作先寫入宿主機緩存,后異步寫入物理磁盤,寫入快,但宿主機崩潰可能丟數據。

      • directsync: 類似none,但使用O_DIRECT | O_SYNC。

      • unsafe: 僅用于測試,完全依賴宿主機緩存,不保證數據一致性。

    • I/O模式 (io):

      • native: 使用Linux AIO (Asynchronous I/O),通常是最佳性能選擇。

      • threads: 使用QEMU用戶空間的線程池處理I/O。

    • I/O線程 (<iothreads>X</iothreads>,?<iothreadids>):

      • 為VM分配專用的I/O處理線程,減少主QEMU線程的I/O壓力。

      • 示例 (分配1個iothread):

        <iothreads>1</iothreads>
        ...
        <disk type='file' device='disk'><driver name='qemu' type='qcow2' cache='none' io='native'/><source file='/path/to/vm.qcow2'/><target dev='vda' bus='virtio'/><iotune> <!-- 可選,精細控制 --><total_bytes_sec>...</total_bytes_sec><total_iops_sec>...</total_iops_sec></iotune><address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/><iothread_ids> <!-- 僅virtio-scsi支持綁定到特定iothread --><iothread id="1"/></iothread_ids>
        </disk>

        content_copydownload

        Use code?with caution.Xml
      • 對于virtio-blk,可以通過?driver ... queue_size=N?調整隊列深度,并結合?<blkiotune>?進行IO限速。

    • 塊大小 (<blockio logical_block_size='512' physical_block_size='4096'/>):?如果底層物理磁盤是4K扇區 (Advanced Format),對齊VM的塊大小可以提高性能。

  4. 網絡I/O優化 (<interface>):

    • 設備模型 (<model type='virtio'/>):?始終使用?virtio?(virtio-net),這是半虛擬化網卡,性能遠超模擬的?e1000?或?rtl8139。

    • 多隊列Virtio-net (queues='N'):

      • 允許VM有多個收發隊列,每個隊列可以由不同的vCPU處理,提高網絡吞吐和并發。

      • N?通常設置為VM的vCPU數量,但不超過網卡物理隊列數(如果是SR-IOV)或宿主機支持的隊列數。

      • 示例:

        <interface type='bridge'><source bridge='br0'/><model type='virtio'/><driver name='vhost' queues='4'/> <!-- 假設VM有4個vCPU --><address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
        </interface>

        content_copydownload

        Use code?with caution.Xml
    • SR-IOV (如前所述):?如果硬件支持,配置?<interface type='hostdev' managed='yes'>?并指定PF的VF。

  5. 顯卡 (<video>):

    • 對于服務器VM,通常不需要強大的圖形性能。使用?virtio?顯卡模型,或?none?(如果通過串行控制臺管理)。

    • <model type='virtio' heads='1' primary='yes'/>

    • 如果完全不需要圖形界面,可以移除<graphics>和<video>部分,僅保留<console>。

階段六:虛擬機內部 (Guest OS) 優化

  1. 安裝Virtio驅動:?現代Linux發行版通常自帶Virtio驅動。Windows VM需要手動安裝Virtio驅動 (從Fedora項目下載ISO)。

  2. Guest OS調優:

    • 關閉不必要的服務。

    • I/O調度器:?對于virtio-blk或virtio-scsi設備,在VM內部也建議使用?noop?或?none?(NVMe) 或?mq-deadline?(新內核)。

      # 在VM內部執行
      echo 'noop' > /sys/block/vda/queue/scheduler # 假設VM磁盤是vda

      content_copydownload

      Use code?with caution.Bash
    • 網絡參數:?調整TCP/IP棧參數,如增大緩沖區等,根據應用類型而定。

    • 時間同步:?確保VM時間與宿主機同步,KVM通常會自動處理,但檢查一下沒壞處 (chrony?或?systemd-timesyncd)。

階段七:持續監控與調整

  1. 宿主機監控:

    • top,?htop?(查看CPU、內存占用)

    • vmstat,?iostat,?sar?(系統活動、I/O統計)

    • numastat -m <qemu_pid>?(查看VM在NUMA節點間的內存分布)

    • perf top -p <qemu_pid>?(分析VM進程的熱點函數)

    • virsh domstats <vm_name>?(獲取VM的各種統計信息)

    • virt-top?(類似top,但針對VM)

  2. VM內部監控:?使用VM內部的監控工具。

  3. 基準測試:?在優化前后進行基準測試(如?fio?for disk I/O,?iperf?for network,?sysbench?for CPU/memory),量化優化效果。

  4. 迭代優化:?性能優化是一個持續的過程。根據監控結果和應用需求,不斷調整配置。

重要注意事項:

  • ** workload特性:** 不同的VM應用(如Web服務器、數據庫、計算密集型任務)對資源的需求和瓶頸點不同,優化策略應有所側重。

  • 穩定性優先:?不要為了極致性能而犧牲穩定性。某些激進的優化可能導致系統不穩定。

  • 逐步調整:?每次只修改一個或少數幾個相關參數,測試效果,避免一次性改動過多難以定位問題。

  • 備份:?在進行重大配置更改前,備份宿主機和VM的重要數據及配置文件。

  • 文檔:?記錄你的優化步驟和參數,方便后續維護和問題排查。

對于雙路CPU,NUMA親和性 (CPU和內存綁定到同一NUMA節點)?是最關鍵的優化點之一。其次是使用Virtio驅動和設備,然后是磁盤I/O (緩存模式、I/O模式、鏡像格式)?和網絡I/O (多隊列、vhost-net)。HugePages對內存密集型應用也非常有益。

遵循這些步驟,你的KVM環境應該能達到相當高的性能水平。祝你成功!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82738.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82738.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82738.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

adb查看、設置cpu相關信息

查內存 adb shell dumpsys meminfo查CPU top -m 10打開 system_monitor adb shell am start -n eu.chainfire.perfmon/.LaunchActivity設置CPU的核心數 在/sys/devices/system/cpu目錄下可以看到你的CPU有幾個核心&#xff0c;如果是雙核&#xff0c;就是cpu0和cpu1&#xff0c…

【Unity基礎】Unity新手實戰教程:用ScriptableObject控制Cube顏色

目錄 項目概述&#x1f6e0;? 完整操作步驟&#xff08;10分鐘內完成&#xff09;步驟1&#xff1a;創建ScriptableObject類步驟2&#xff1a;創建顏色配置資產步驟3&#xff1a;創建Cube控制器步驟4&#xff1a;設置場景和Cube步驟5&#xff1a;添加簡單UI提示步驟6&#xff…

One Year~

入局 作為科班學生&#xff0c;沒事就在CSDN閑逛&#xff0c;只作為旁觀者的身份去體會別人的好文。當時也沒想著說去自己寫一些博客記錄學習過程。相信大多數同學和我有一樣的心理。 但在看魚皮哥的課程時&#xff0c;發現他有著寫文檔和博客的習慣&#xff0c;整理自己的思路…

【Redis】第3節|深入理解Redis線程模型

一、Redis基礎認知 &#xff08;一&#xff09;定義與定位 Redis&#xff08;Remote Dictionary Server&#xff09;是開源高性能鍵值數據庫&#xff0c;核心特點如下&#xff1a; 數據結構豐富&#xff1a;支持字符串、哈希、列表、集合、有序集合等復雜數據類型&#xff0…

vben-admin 2.8.0 版本修改 axios響應處理邏輯

此前端框架下的 Axios 在后端返回的結果老是無法正常解析&#xff0c;找到他源碼的封裝類&#xff0c;修正這個問題 文件位于 src\utils\http\axios\index.ts 修改前 transformResponseHook: (res: AxiosResponse<Result>, options: RequestOptions) > {const { t }…

深入理解JavaScript設計模式之原型模式

目錄 前言引入原型模式頭腦風暴傳統方式 vs 原型模式實戰案例&#xff1a;飛機大戰中的分身術 原型模式實現的關鍵秘密實戰演練&#xff1a;造一架能分身的飛機克隆是創建對象的手段原型模式&#xff1a;輕裝上陣的造物術 原型編程范型的一些規則原型編程的四大門規&#xff1a…

【數據庫】概述(純理論)

數據庫系統引論 數據管理系統的發展 數據管理&#xff1a;對數據分類、組織、編碼、存儲、檢索、維護 發展&#xff1a;人工管理、文件系統、數據庫系統 40-50年代 人工管理 數據不保存&#xff0c;沒有專門軟件管理數據&#xff0c;應用程序完全依賴于數據&#xff0c;數據…

語音合成之十七 語音合成(TTS)中文自然度:問題、成因、解決方案

語音合成&#xff08;TTS&#xff09;中文自然度&#xff1a;問題、成因、解決方案 中文TTS系統基本架構中文TTS常見問題深度剖析與解決方案音色跳變成因分析解決方案 聲調與重讀錯誤成因分析業界解決方案 漏讀與斷句錯誤成因分析業界解決方案 在跨語言TTS系統比較中&#xff0…

我在 Linux 進程管理中踩過的坑:僵尸、瞬時與不可中斷進程實戰實錄

作為運維老鳥&#xff0c;我曾在 Linux 進程管理上栽過不少跟頭。記得第一次遇到滿屏僵尸進程時&#xff0c;服務器直接卡到連 SSH 都登不上&#xff0c;看著ps命令里一排排刺眼的Z狀態進程&#xff0c;手心直冒冷汗。后來又碰到過瞬時進程搞崩日志系統&#xff0c;明明監控顯示…

【設計模式】簡單工廠模式,工廠模式,抽象工廠模式,單例,代理,go案例區分總結

工廠模式三種類型&#xff1a; 一、簡單工廠模式&#xff08;Simple Factory&#xff09; 定義&#xff1a; 用一個工廠類&#xff0c;根據傳入的參數決定創建哪一種具體產品類實例。 面試說法&#xff1a; 由一個統一的工廠創建所有對象&#xff0c;增加新產品時需要修改工…

某標桿房企BI平臺2.0升級實踐

當房地產行業從“規模競賽”轉向“精益運營”&#xff0c;數字化轉型成為破局關鍵。某千億房企攜手億信華辰&#xff0c;以“用數據重構業務價值鏈”為目標&#xff0c;歷經6個月完成BI平臺戰略性升級。在這場從“數據可視化”到“決策智能化”的躍遷中&#xff0c;億信華辰ABI…

Lua 腳本在 Redis 中的運用-24 (使用 Lua 腳本實現原子計數器)

實踐練習:使用 Lua 腳本實現原子計數器 實現原子計數器是許多應用程序中的常見需求,例如跟蹤網站訪問量、限制 API 請求或管理庫存。雖然 Redis 提供了 INCR 命令用于遞增整數,但在復雜場景或與其他操作結合時直接使用它可能并不足夠。本課程探討了如何在 Redis 中利用 Lua…

Rust 學習筆記:使用迭代器改進 minigrep

Rust 學習筆記&#xff1a;使用迭代器改進 minigrep Rust 學習筆記&#xff1a;使用迭代器改進 minigrep不使用 clone&#xff0c;而使用迭代器使用迭代器適配器使代碼更清晰在循環或迭代器之間進行選擇 Rust 學習筆記&#xff1a;使用迭代器改進 minigrep 前情提要&#xff1…

el-table配置表頭固定而且高度變化

根據官網提示只要在 el-table 元素中定義了 height 屬性&#xff0c;即可實現固定表頭的表格&#xff0c;而不需要額外的代碼。 如果你想既要固定表頭&#xff0c;又要下方表格高度自適應&#xff0c;可以設置為 height"100%" &#xff1a; 然后外層設置scroll:

弱光環境下如何手持相機拍攝靜物:攝影曝光之等效曝光認知

寫在前面 博文內容為一次博物館靜物拍攝筆記的簡單總結內容涉及&#xff1a;弱光環境拍攝靜物如何選擇&#xff0c;以及等效曝光的認知理解不足小伙伴幫忙指正 &#x1f603;,生活加油 我看遠山&#xff0c;遠山悲憫 持續分享技術干貨&#xff0c;感興趣小伙伴可以關注下 _ 采…

ARM筆記-ARM偽指令及編程基礎

第四章 ARM偽指令及編程基礎 4.1 偽指令概述 4.1.1 偽指令定義 人們設計了一些專門用于指導匯編器進行匯編工作的指令&#xff0c;由于這些指令不形成機器碼指令&#xff0c;它們只是在匯編器進行匯編工作的過程中起作用&#xff0c;所以被叫做偽指令。 4.1.2 偽指令特征 …

智能手表怎么申請歐盟EN 18031認證

智能手表申請歐盟 EN 18031 認證&#xff08;針對消費類物聯網設備的網絡安全標準&#xff09;的流程與智能門鎖類似&#xff0c;但需結合手表的功能特性&#xff08;如數據交互、定位、支付等&#xff09;調整合規重點。以下是具體流程和關鍵要點&#xff1a; 一、標準適配與…

算法-全排列

1、全排列函數的使用 舉例&#xff1a;{1,2,3}的全排列 #include<iostream> #include<bits/stdc.h> using namespace std; typedef long long ll; int main(){ll a[3] {1, 2, 3};do{for (ll i 0; i < 3;i){cout << a[i] << " ";}cout…

面試加分秘籍:校招數據傾斜場景下的SQL優化方案

校招面試經常會問大家有沒有過調優的經驗&#xff0c;相信大家的回答基本都是往數據傾斜和小文件問題這兩方面回答&#xff0c;對于數據傾斜相信大部分同學對熱key打散或null值引發的傾斜已經非常熟悉&#xff0c;但這些內容面試官也是聽膩了&#xff0c;希望大家在面試時候講一…

Elasticsearch索引機制與Lucene段合并策略深度解析

引言 在現代分布式搜索引擎Elasticsearch中&#xff0c;文檔的索引、更新和刪除操作不僅是用戶交互的核心入口&#xff0c;更是底層存儲架構設計的關鍵挑戰。本文圍繞以下核心鏈路展開&#xff1a; 文檔生命周期管理&#xff1a;從客戶端請求路由到分片定位&#xff0c;從內存…