NVMe SSD 測試流程全攻略_穩定性驗證

更新於 發佈於 閱讀時間約 41 分鐘
除了性能,穩定性是NVMe SSD作為儲存設備的另一個核心指標。一個性能再強大的SSD,如果穩定性不足,頻繁出現錯誤、數據丟失甚至崩潰,那麼它在實際應用中將毫無價值。穩定性驗證旨在模擬各種真實和極端的使用情境,確保SSD在長時間、高壓、異常條件下依然能夠可靠地運行,保障數據的完整性和系統的穩定性。

4.1 長時間壓力測試

長時間壓力測試是穩定性驗證的基石,它模擬SSD在真實環境下可能遇到的持續高負載工作。這類測試通常會運行數天、數週甚至數月,以暴露潛在的韌體Bug、硬體缺陷或性能衰減問題。

  • 測試目的: * 發現潛在Bug:許多Bug只會在長時間運行或特定累積條件下才會觸發,例如內存洩漏、資源耗盡、數據結構損壞等。 * 評估可靠性:觀察SSD在持續高溫、高負載下的錯誤率、性能穩定性,以及SMART參數的變化趨勢。 * 加速老化:通過高強度寫入,加速NAND Flash的磨損,評估磨損均衡和垃圾回收演算法的有效性。
  • 測試方法: * 24/7連續讀寫:使用FIO或其他工具,對SSD進行不間斷的讀寫操作。可以選擇純讀、純寫或混合讀寫模式,塊大小和隊列深度也應根據目標應用場景進行配置。 * 混合
  • 負載測試:模擬更複雜的真實工作負載,例如,在數據庫負載的同時進行文件拷貝,或者在虛擬機運行時進行系統備份。這可以通過運行多個FIO實例或結合其他應用程式來實現。 *溫度監控:在長時間壓力測試期間,必須實時監控SSD的溫度。過高的溫度不僅會影響性能,還會加速元器件老化,甚至導致熱保護關機。可以使用 nvme smart-log 命令定期獲取溫度信息。
  • 腳本範例:長時間混合負載壓力測試
    以下是一個Bash腳本,結合FIO和SMART監控,進行長時間的混合讀寫壓力測試。它會定期記錄SMART日誌,並在發現異常時發出警告。
#!/bin/bash  
DEVICE="/dev/nvme0n1" # 替換為你的NVMe設備節點
TEST_DURATION_HOURS=72 # 測試持續時間(小時)
LOG_DIR="/var/log/nvme_stress_test"
mkdir -p $LOG_DIR
FIO_JOB_FILE="$LOG_DIR/mixed_workload.fio"
cat <<EOF > $FIO_JOB_FILE
[global]
ioengine=libaio
direct=1
size=10g
runtime=3600
time_based
group_reporting
filename=$DEVICE
[randread_4k]
rw=randread
bs=4k
numjobs=4
iodepth=32
[randwrite_4k]
rw=randwrite
bs=4k
numjobs=4
iodepth=32
[seqread_1m]
rw=read
bs=1m
numjobs=1
iodepth=1
[seqwrite_1m]
rw=write
bs=1m
numjobs=1
iodepth=1
EOF
monitor_smart() {
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
SMART_INFO=$(nvme smart-log $DEVICE)
CRITICAL_WARNING=$(echo "$SMART_INFO" | grep "Critical Warning" | awk '{print $3}')
TEMPERATURE=$(echo "$SMART_INFO" | grep "Temperature" | awk '{print $2}')
PERCENTAGE_USED=$(echo "$SMART_INFO" | grep "Percentage Used" | awk '{print $3}')
MEDIA_ERRORS=$(echo "$SMART_INFO" | grep "Media and Data Integrity Errors" | awk '{print $6}')
ERROR_LOG_ENTRIES=$(echo "$SMART_INFO" | grep "Number of Error Information Log Entries" | awk '{print $7}')
UNSAFE_SHUTDOWNS=$(echo "$SMART_INFO" | grep "Unsafe Shutdowns" | awk '{print $3}')
echo "[$TIMESTAMP] SMART Log: Temp=${TEMPERATURE}C, Used=${PERCENTAGE_USED}%, CW=${CRITICAL_WARNING}, MediaErrors=${MEDIA_ERRORS}, ErrorLogEntries=${ERROR_LOG_ENTRIES}, UnsafeShutdowns=${UNSAFE_SHUTDOWNS}" | tee -a $LOG_DIR/smart_log.csv
if [ "$CRITICAL_WARNING" -ne "0" ] || [ "$MEDIA_ERRORS" -ne "0" ] || [ "$ERROR_LOG_ENTRIES" -ne "0" ] || [ "$UNSAFE_SHUTDOWNS" -ne "0" ]; then
echo "[$TIMESTAMP] WARNING: SMART anomaly detected! Check $LOG_DIR/smart_log.csv for details." | tee -a $LOG_DIR/alert.log
fi
}
echo "Starting NVMe SSD long-term stress test on $DEVICE for $TEST_DURATION_HOURS hours..."
START_TIME=$(date +%s)
END_TIME=$((START_TIME + TEST_DURATION_HOURS * 3600))
while [ $(date +%s) -lt $END_TIME ]; do
CURRENT_TIME=$(date "+%Y-%m-%d %H:%M:%S")
ELAPSED_SECONDS=$(( $(date +%s) - START_TIME ))
ELAPSED_HOURS=$(( ELAPSED_SECONDS / 3600 ))
echo -e "\n[$CURRENT_TIME] Running FIO for 1 hour. Elapsed: ${ELAPSED_HOURS}h / ${TEST_DURATION_HOURS}h"
fio $FIO_JOB_FILE --output="$LOG_DIR/fio_output_$(date +%Y%m%d_%H%M%S).json" --output-format=json
monitor_smart
sleep 60
done
echo "NVMe SSD long-term stress test completed."
  • 使用說明: 1. 將腳本保存為 run_stress_test.sh 並賦予執行權限。 2. 修改 DEVICE 和TEST_DURATION_HOURS 變量。 3. 運行 ./run_stress_test.sh 。 4. 測試結果和SMART日誌將保存在 $LOG_DIR (默認為 /var/log/nvme_stress_test )中。


4.2 數據完整性測試

數據完整性是SSD最基本也是最重要的功能。數據完整性測試旨在確保數據在寫入、讀取、傳輸和長期儲存過程中不被損壞或篡改。

  • 測試方法: * CRC校驗與數據比對: * 寫入階段:在寫入數據之前,計算原始數據的CRC(Cyclic Redundancy Check)或MD5/SHA256哈希值。 * 讀取階段:從SSD讀回數據後,再次計算其CRC或哈希值。 * 比對:將讀回數據的哈希值與原始數據的哈希值進行比對。如果兩者不一致,則表示數據已損壞。 * FIO的數據驗證功能:FIO本身支持數據驗證。在FIO命令中添加 --verify=md5 或 --verify=crc32 等參數,FIO會在寫入後自動讀回數據並進行校驗。如果校驗失敗,FIO會報告錯誤。
  • 腳本範例:FIO數據完整性測試
fio --name=data_integrity_test \
--ioengine=libaio \
--direct=1 \
--rw=randwrite \
--bs=4k \
--numjobs=1 \
--iodepth=16 \
--size=10g \
--filename=/dev/nvme0n1 \
--verify=md5 \
--verify_pattern=0xdeadbeef \
--verify_interval=1024 \
--do_verify=1 \
--runtime=300 \
--group_reporting \
  • --verify=md5 :指定使用MD5算法進行數據校驗。
  • --verify_pattern=0xdeadbeef :指定一個寫入的數據模式。FIO會使用這個模式填充數據,並在讀回時驗證。
  • --verify_interval=1024 :每寫入1024個塊就進行一次驗證。這有助於及早發現問題。
  • --do_verify=1 :啟用數據驗證功能。
  • 長期數據保持測試 (Data Retention):
    將數據寫入SSD,然後斷電並將SSD放置在不同溫度下(如高溫、常溫),持續數天、數週或數月。然後重新上電,讀回數據並進行比對,驗證數據在長期斷電狀態下的保持能力。這對於NAND Flash的特性非常重要。

4.3 掉電保護測試 (Power Loss Protection, PLP)

掉電保護是企業級SSD的關鍵特性,確保在意外斷電時,SSD能夠將緩存中的數據安全地寫

入NAND Flash,防止數據丟失或損壞。即使是消費級SSD,也應具備基本的掉電保護機

制。

  • 測試目的: * 驗證SSD在電源突然中斷時,數據完整性是否得到保障。 * 驗證SSD在斷電後重新上電時,能否正常啟動並被系統識別。 * 驗證SSD的內部電容(如果有的話)是否能提供足夠的能量,完成緩存數據的寫入。
  • 測試方法:
    1. 準備:確保SSD處於活動狀態,有數據正在寫入或緩存中存在未同步數據。這可以通過FIO的 --fdatasync=0 或 --fsync=0 參數來模擬。
    2. 精確斷電:在數據寫入過程中,使用可編程電源供應器或專用斷電測試設備,精確地在指定時間點切斷SSD的電源。理想情況下,斷電應該在數據寫入到緩存但尚未完全寫入NAND Flash的瞬間發生。
    3. 恢復與驗證: * 重新上電,檢查SSD是否能被系統正確識別,文件系統是否完整(運行 fsck )。 *讀取斷電前寫入的數據,並與原始數據進行比對,確保數據完整性。 * 檢查SMART日誌中的Unsafe Shutdowns 計數器是否增加,以及是否有 Media and Data Integrity Errors或 Number of Error Information Log Entries 。
  • 腳本範例:自動化掉電測試框架(概念性)
    真正的自動化掉電測試需要與硬體測試台(如電源控制單元、繼電器)集成。
    以下是一個概念性的Python腳本框架,展示了測試流程。
import subprocess  
import time
import os

# 假設這些函數通過串口、網絡或其他方式控制外部電源設備
def power_off_ssd(device_id):
print(f"[HARDWARE ACTION] Powering off SSD {device_id}...")
# 實際實現:調用外部電源控制API或執行命令
# 例如: serial_port.write(b'power_off_cmd')
time.sleep(1) # 模擬硬件響應時間

def power_on_ssd(device_id):
print(f"[HARDWARE ACTION] Powering on SSD {device_id}...")
# 實際實現:調用外部電源控制API或執行命令
# 例如: serial_port.write(b'power_on_cmd')
time.sleep(5) # 等待SSD上電並被系統識別

def check_ssd_present(device_path):
return os.path.exists(device_path)

def run_fio_write(device_path, test_file, size="1G", bs="4k", runtime=10):
print(f"Starting FIO write to {device_path}...")
cmd = [
"fio", "--name=power_loss_write",
"--ioengine=libaio", "--direct=1", "--rw=write",
f"--bs={bs}", f"--size={size}", f"--filename={test_file}",
f"--runtime={runtime}", "--time_based", "--group_reporting",
"--fdatasync=0"
]
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return process

def calculate_md5(filepath):
if not os.path.exists(filepath):
return None
result = subprocess.run(["md5sum", filepath], capture_output=True, text=True, check=True)
return result.stdout.split(" ")[0]

def power_loss_test_cycle(device_path, mount_point, test_count=1):
DEVICE_NODE = device_path.replace('/dev/', '')
for i in range(test_count):
print(f"\n--- Power Loss Test Cycle {i+1}/{test_count} ---")
print("Preparing filesystem...")
subprocess.run(["sudo", "umount", mount_point], stderr=subprocess.DEVNULL)
subprocess.run(["sudo", "wipefs", "-a", device_path])
subprocess.run(["sudo", "parted", "-a", "opt", device_path, "mklabel", "gpt"])
subprocess.run(["sudo", "parted", "-a", "opt", device_path, "mkpart", "primary", "ext4", "0%", "100%"])
subprocess.run(["sudo", "mkfs.ext4", "-F", f"{device_path}p1"])
subprocess.run(["sudo", "mount", f"{device_path}p1", mount_point])
subprocess.run(["sudo", "chown", f"{os.getuid()}:{os.getgid()}", mount_point])

original_test_file = os.path.join(mount_point, "original_data.bin")
subprocess.run(["dd", "if=/dev/urandom", f"of={original_test_file}", "bs=4K", "count=100000"])
original_md5 = calculate_md5(original_test_file)
print(f"Original data MD5: {original_md5}")

fio_process = run_fio_write(device_path, original_test_file, size="500M", runtime=60)
time.sleep(5)
print("Triggering power off...")
power_off_ssd(DEVICE_NODE)
fio_process.wait()
print("FIO process terminated.")

power_on_ssd(DEVICE_NODE)
if not check_ssd_present(device_path):
print(f"ERROR: SSD {device_path} not detected after re-power! Test FAILED.")
continue

print("Checking filesystem integrity...")
subprocess.run(["sudo", "umount", mount_point], stderr=subprocess.DEVNULL)
fsck_result = subprocess.run(["sudo", "fsck", "-y", f"{device_path}p1"], capture_output=True, text=True)
print(fsck_result.stdout)

if "FILE SYSTEM WAS MODIFIED" in fsck_result.stdout or "BAD BLOCK" in fsck_result.stdout:
print("WARNING: Filesystem modified or bad blocks found during fsck.")

subprocess.run(["sudo", "mount", f"{device_path}p1", mount_point])
subprocess.run(["sudo", "chown", f"{os.getuid()}:{os.getgid()}", mount_point])

read_test_file = os.path.join(mount_point, "original_data.bin")
if os.path.exists(read_test_file):
read_md5 = calculate_md5(read_test_file)
print(f"Read data MD5: {read_md5}")
if original_md5 == read_md5:
print("Data integrity PASSED: MD5 sums match.")
else:
print("Data integrity FAILED: MD5 sums do NOT match!")
else:
print("Data integrity FAILED: Original test file not found after power loss.")

smart_log = subprocess.run(["nvme", "smart-log", device_path], capture_output=True, text=True).stdout
unsafe_shutdowns = int(smart_log.split("Unsafe Shutdowns:")[1].split("\n")[0].strip())
print(f"Unsafe Shutdowns count: {unsafe_shutdowns}")

if unsafe_shutdowns == 0:
print("WARNING: Unsafe Shutdowns count did not increase. PLP might be too effective or test setup issue.")

subprocess.run(["sudo", "umount", mount_point], stderr=subprocess.DEVNULL)
subprocess.run(["sudo", "rm", "-rf", mount_point])
print("Power loss test completed.")

if __name__ == "__main__":
NVME_DEVICE_PATH = "/dev/nvme0n1"
MOUNT_POINT = "/mnt/nvme_plp_test"
os.makedirs(MOUNT_POINT, exist_ok=True)
power_loss_test_cycle(NVME_DEVICE_PATH, MOUNT_POINT, test_count=5)

注意:此腳本中的 power_off_ssd 和 power_on_ssd 函數需要您根據實際的硬體測試平台進行實現。這通常涉及與電源控制單元(PCU)或可編程電源供應器進行通信。這是一個複雜的測試,需要專業的硬體支持。

4.4 熱插拔測試 (Hot-Plug Test)

熱插拔測試用於驗證SSD在系統運行狀態下,頻繁插拔時的穩定性、數據安全性和系統兼容性。這對於伺服器和儲存陣列等需要不停機維護的應用場景尤為重要。

  • 測試目的: * 驗證SSD在熱插拔後能否被系統正確識別和初始化。 * 驗證熱插拔操作是否會導致數據丟失或損壞。 * 驗證熱插拔操作是否會影響系統的穩定性,例如導致系統崩潰或死機。 * 驗證SSD的韌體在熱插拔事件中的響應和恢復能力。
  • 測試方法:
    1. 準備:確保SSD上存在數據,並且系統正在對其進行讀寫操作(例如,運行FIO或拷貝文件)。
    2. 熱拔:在系統運行狀態下,將NVMe SSD從PCIe插槽中拔出。這通常需要特殊的熱插拔背板或測試治具。
    3. 熱插:在短暫延遲後,將SSD重新插入PCIe插槽。
    4. 驗證: * 檢查系統日誌( dmesg 、 /var/log/syslog ),確認SSD的拔出和插入事件是否被正確記錄,沒有異常錯誤。 * 檢查SSD是否能被系統重新識別( nvme list )。 * 檢查文件系統的完整性( fsck )。 * 讀取SSD上的數據,並與熱拔前進行比對,確保數據完整性。 * 在熱插拔後,繼續對SSD進行讀寫操作,觀察其性能和穩定性。 5. 重複循環:重複熱插拔操作數百次甚至數千次,以暴露潛在的偶發性問題。
  • 腳本範例:熱插拔測試框架(概念性)
    與掉電測試類似,熱插拔測試也需要硬體支持。以下是一個概念性的Python腳本框架。


import subprocess  
import time
import os
import json

# 假設這些函數通過串口、網絡或其他方式控制外部熱插拔治具
def hot_unplug_ssd(device_id):
print(f"[HARDWARE ACTION] Hot-unplugging SSD {device_id}...")
# 實際實現:調用外部治具API或執行命令
time.sleep(2) # 模擬硬件響應時間

def hot_plug_ssd(device_id):
print(f"[HARDWARE ACTION] Hot-plugging SSD {device_id}...")
# 實際實現:調用外部治具API或執行命令
time.sleep(5) # 等待SSD重新識別

def get_nvme_devices():
result = subprocess.run(["nvme", "list", "-o", "json"], capture_output=True, text=True)
try:
devices_info = json.loads(result.stdout)
return [d["DevicePath"] for d in devices_info["Devices"]]
except (json.JSONDecodeError, KeyError):
return []

def check_ssd_present(device_path):
return os.path.exists(device_path)

def run_fio_write(device_path, test_file, size="1G", bs="4k", runtime=10):
print(f"Starting FIO write to {device_path}...")
cmd = [
"fio", "--name=hotplug_write",
"--ioengine=libaio", "--direct=1", "--rw=write",
f"--bs={bs}", f"--size={size}", f"--filename={test_file}",
f"--runtime={runtime}", "--time_based", "--group_reporting",
"--fdatasync=0"
]
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return process

def calculate_md5(filepath):
if not os.path.exists(filepath):
return None
result = subprocess.run(["md5sum", filepath], capture_output=True, text=True, check=True)
return result.stdout.split(" ")[0]

def hot_plug_test_cycle(device_path, mount_point, test_count=10):
DEVICE_NODE = device_path.replace('/dev/', '')
for i in range(test_count):
print(f"\n--- Hot-Plug Test Cycle {i+1}/{test_count} ---")
print("Preparing filesystem and data...")
subprocess.run(["sudo", "umount", mount_point], stderr=subprocess.DEVNULL)
subprocess.run(["sudo", "wipefs", "-a", device_path])
subprocess.run(["sudo", "parted", "-a", "opt", device_path, "mklabel", "gpt"])
subprocess.run(["sudo", "parted", "-a", "opt", device_path, "mkpart", "primary", "ext4", "0%", "100%"])
subprocess.run(["sudo", "mkfs.ext4", "-F", f"{device_path}p1"])
subprocess.run(["sudo", "mount", f"{device_path}p1", mount_point])
subprocess.run(["sudo", "chown", f"{os.getuid()}:{os.getgid()}", mount_point])

original_test_file = os.path.join(mount_point, "hotplug_data.bin")
subprocess.run(["dd", "if=/dev/urandom", f"of={original_test_file}", "bs=4K", "count=10000"])
original_md5 = calculate_md5(original_test_file)
print(f"Original data MD5: {original_md5}")

fio_process = run_fio_write(device_path, original_test_file, size="100M", runtime=30)
time.sleep(5)
print("Triggering hot-unplug...")
hot_unplug_ssd(DEVICE_NODE)
fio_process.terminate()
fio_process.wait()

if check_ssd_present(device_path):
print(f"ERROR: SSD {device_path} still detected after hot-unplug! Test FAILED.")
continue
print(f"SSD {device_path} successfully disappeared.")

print("Triggering hot-plug...")
hot_plug_ssd(DEVICE_NODE)

if not check_ssd_present(device_path):
print(f"ERROR: SSD {device_path} not detected after hot-plug! Test FAILED.")
continue
print(f"SSD {device_path} successfully re-detected.")

print("Checking filesystem integrity...")
subprocess.run(["sudo", "umount", mount_point], stderr=subprocess.DEVNULL)
fsck_result = subprocess.run(["sudo", "fsck", "-y", f"{device_path}p1"], capture_output=True, text=True)
print(fsck_result.stdout)
subprocess.run(["sudo", "mount", f"{device_path}p1", mount_point])
subprocess.run(["sudo", "chown", f"{os.getuid()}:{os.getgid()}", mount_point])

read_test_file = os.path.join(mount_point, "hotplug_data.bin")
if os.path.exists(read_test_file):
read_md5 = calculate_md5(read_test_file)
print(f"Read data MD5: {read_md5}")
if original_md5 == read_md5:
print("Data integrity PASSED: MD5 sums match.")
else:
print("Data integrity FAILED: MD5 sums do NOT match!")
else:
print("Data integrity FAILED: Original test file not found after hot-plug.")

print("Checking system logs for errors...")
dmesg_output = subprocess.run(["dmesg", "-T"], capture_output=True, text=True).stdout
if "error" in dmesg_output.lower() or "fail" in dmesg_output.lower():
print("WARNING: Errors or failures found in dmesg after hot-plug. Review logs.")

subprocess.run(["sudo", "umount", mount_point], stderr=subprocess.DEVNULL)
subprocess.run(["sudo", "rm", "-rf", mount_point])
print("Hot-plug test completed.")

if __name__ == "__main__":
NVME_DEVICE_PATH = "/dev/nvme0n1" # 替換為你的NVMe設備路徑
MOUNT_POINT = "/mnt/nvme_hotplug_test"
os.makedirs(MOUNT_POINT, exist_ok=True)
hot_plug_test_cycle(NVME_DEVICE_PATH, MOUNT_POINT, test_count=3)

穩定性驗證是確保NVMe SSD長期可靠運行的關鍵。通過長時間壓力測試、數據完整性測試、掉電保護測試和熱插拔測試,我們可以全面評估SSD在各種嚴苛條件下的表現,從而提升產品的品質和用戶的信任。

留言
avatar-img
留言分享你的想法!
avatar-img
SSD驗證工程師的告白
5會員
13內容數
針對平時SSD驗證上的感想
2025/06/23
NVMe SSD以其卓越的性能而聞名,因此性能驗證是測試流程中至關重要的一環。這不僅僅是為了確認SSD是否達到其標稱的IOPS和吞吐量,更是為了評估其在各種真實工作負載下的實際表現和穩定性。FIO(Flexible I/O Tester)是業界公認的、功能強大的I/O測試工具,廣泛應用於儲存設備的性
Thumbnail
2025/06/23
NVMe SSD以其卓越的性能而聞名,因此性能驗證是測試流程中至關重要的一環。這不僅僅是為了確認SSD是否達到其標稱的IOPS和吞吐量,更是為了評估其在各種真實工作負載下的實際表現和穩定性。FIO(Flexible I/O Tester)是業界公認的、功能強大的I/O測試工具,廣泛應用於儲存設備的性
Thumbnail
2025/06/22
本篇文章提供NVMe SSD測試的完整指南,涵蓋基礎知識、基本指令、功能驗證以及錯誤注入與恢復測試,並附帶腳本範例,幫助讀者全面瞭解NVMe SSD的驗證精髓。
Thumbnail
2025/06/22
本篇文章提供NVMe SSD測試的完整指南,涵蓋基礎知識、基本指令、功能驗證以及錯誤注入與恢復測試,並附帶腳本範例,幫助讀者全面瞭解NVMe SSD的驗證精髓。
Thumbnail
2025/06/19
本文深入探討固態硬碟(SSD)驗證流程對產品成敗的決定性影響,從驗證流程的全貌出發,剖析其在技術層面如何確保產品良率與穩定性,進而在商業層面如何滿足客戶需求、提升市場競競爭力並有效控制成本。透過案例分析,闡明驗證的關鍵作用,並呼籲業界重視這項關鍵工作。
Thumbnail
2025/06/19
本文深入探討固態硬碟(SSD)驗證流程對產品成敗的決定性影響,從驗證流程的全貌出發,剖析其在技術層面如何確保產品良率與穩定性,進而在商業層面如何滿足客戶需求、提升市場競競爭力並有效控制成本。透過案例分析,闡明驗證的關鍵作用,並呼籲業界重視這項關鍵工作。
Thumbnail
看更多
你可能也想看
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
具備 IP55、密碼保護等機能;防水防塵技術 (IP55),隨時隨地確保耐用度
Thumbnail
具備 IP55、密碼保護等機能;防水防塵技術 (IP55),隨時隨地確保耐用度
Thumbnail
在尋找電腦維修推薦時,應注意選擇有良好口碑和正面評價的維修店,確認其技術專業度和服務品質。檢查店家的維修保固和費用透明度,以避免隱藏費用。此外,了解維修店是否使用原廠零件,以及其客戶服務的反應速度和解決問題的能力。透過朋友推薦或查看線上評價來確保選擇可靠的維修服務。
Thumbnail
在尋找電腦維修推薦時,應注意選擇有良好口碑和正面評價的維修店,確認其技術專業度和服務品質。檢查店家的維修保固和費用透明度,以避免隱藏費用。此外,了解維修店是否使用原廠零件,以及其客戶服務的反應速度和解決問題的能力。透過朋友推薦或查看線上評價來確保選擇可靠的維修服務。
Thumbnail
這篇文章記錄了一次特殊的電腦維修案例,客戶電腦出現無法上網和不定時當機後無法開機的問題。文章詳細描述了維修過程和最終的結論......
Thumbnail
這篇文章記錄了一次特殊的電腦維修案例,客戶電腦出現無法上網和不定時當機後無法開機的問題。文章詳細描述了維修過程和最終的結論......
Thumbnail
怎麼知道你手機的晶片能用多久?
Thumbnail
怎麼知道你手機的晶片能用多久?
Thumbnail
常在用一些軟體轉移系統區到新的SSD後,在DiskGenius裡面會顯示ESP(損壞),但系統又能正常開機,網路上找到可以修復的方式來紀錄一下。 要準備的軟體是DiskGenius,這裡是5.5.1.1508 最新版; 以及Dism++10.1.1002.1B,兩者都建議別用太舊版本。 首先打
Thumbnail
常在用一些軟體轉移系統區到新的SSD後,在DiskGenius裡面會顯示ESP(損壞),但系統又能正常開機,網路上找到可以修復的方式來紀錄一下。 要準備的軟體是DiskGenius,這裡是5.5.1.1508 最新版; 以及Dism++10.1.1002.1B,兩者都建議別用太舊版本。 首先打
Thumbnail
現在主機遊戲變得很多元,有一些需要靠著一個超級主機來支撐他的記憶體存量,這裡可以回答你的主機硬體必須知道的三件事!
Thumbnail
現在主機遊戲變得很多元,有一些需要靠著一個超級主機來支撐他的記憶體存量,這裡可以回答你的主機硬體必須知道的三件事!
Thumbnail
透過SATA轉USB技術的引入,讓廢棄的硬碟能迎來嶄新的生命,環保友善且擴充儲存空間。本文介紹了SATA轉USB3.0轉接版的優越性,舊硬碟重生再度活躍以及如何透過該技術做到環保友善並擴充儲存空間。
Thumbnail
透過SATA轉USB技術的引入,讓廢棄的硬碟能迎來嶄新的生命,環保友善且擴充儲存空間。本文介紹了SATA轉USB3.0轉接版的優越性,舊硬碟重生再度活躍以及如何透過該技術做到環保友善並擴充儲存空間。
Thumbnail
前言 歷年來舉凡外接式的行動/移動式硬碟機的發展,一路從一開始需要外接電源的3.5吋 再一路進步到2.5吋、也從傳統機械硬碟變成SSD,現在體積越縮越小 各大廠商推出各式外觀行動硬碟也比比皆是、包含今天要玩的Crucial X9 Pro 以下就是美光外接式SSD的相關介紹
Thumbnail
前言 歷年來舉凡外接式的行動/移動式硬碟機的發展,一路從一開始需要外接電源的3.5吋 再一路進步到2.5吋、也從傳統機械硬碟變成SSD,現在體積越縮越小 各大廠商推出各式外觀行動硬碟也比比皆是、包含今天要玩的Crucial X9 Pro 以下就是美光外接式SSD的相關介紹
Thumbnail
透過 Ansys Sherlock 於車用電子可靠度的模擬分析,能提供產品壽命預測、失效分析等模擬,讓產品符合車用國際標準規範,進入車用電子供應鏈。 本次影片中將介紹,汽車 C ‧ A ‧ S ‧ E 四大市場趨勢,這將取決於是否可以開發出具競爭力的新零件或是否能提供創新服務。 C : Con
Thumbnail
透過 Ansys Sherlock 於車用電子可靠度的模擬分析,能提供產品壽命預測、失效分析等模擬,讓產品符合車用國際標準規範,進入車用電子供應鏈。 本次影片中將介紹,汽車 C ‧ A ‧ S ‧ E 四大市場趨勢,這將取決於是否可以開發出具競爭力的新零件或是否能提供創新服務。 C : Con
Thumbnail
事情是這樣的, 因為在去年我上一顆隨身硬碟莫名其妙的掛了, 前一天還好好的, 隔天就不行了。 當時確認硬碟壞了之後, 裡面的檔案說重要也重要, 說不重要也不重要, 因為八成左右是王一博肖戰的東西, 那時我剛準備退圈, 所以想說好像救不回來也沒關係?只是覺得有點可惜, 更何況裡面還是有些外面基本
Thumbnail
事情是這樣的, 因為在去年我上一顆隨身硬碟莫名其妙的掛了, 前一天還好好的, 隔天就不行了。 當時確認硬碟壞了之後, 裡面的檔案說重要也重要, 說不重要也不重要, 因為八成左右是王一博肖戰的東西, 那時我剛準備退圈, 所以想說好像救不回來也沒關係?只是覺得有點可惜, 更何況裡面還是有些外面基本
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News