ClamAV扫描速度提升6.5倍:服务器杀毒配置优化实战指南

看到此篇,大伙都是彦祖、亦菲哈~~~

运维人员福音!当服务器病毒扫描动辄耗时数小时,你是否也曾为此抓狂?亲测优化ClamAV配置,扫描近6千个文件从150秒降至22秒,提升6.5倍;扫描19万个文件从65分钟降至36分钟,提升1.7倍。

文章详细剖析了内存占用高、扫描卡顿、重复扫描三大痛点,提供从病毒库加载策略、文件大小限制到递归深度控制的全套优化方案。包含clamscan与clamdscan指令详解、最佳配置参数清单及实测数据对比,助您轻松实现性能与安全的完美平衡。

话不多说,开干了~~~

一、基础知识

ClamAV扫描指令包含两种方式

第一种:clamscan 直接扫描

第二种:clamdscan 常驻进程扫描,内存长时间会占用到1.3G

优化前思考

**问题1:**加载病毒库到内存:clamd作为守护进程,会将整个病毒库常驻内存(这是为了提高扫描速度),仅病毒库本身就可能占用 500-800MB 内存; 【选择性挑选病毒库加载,如果是识别到当前内存小于4G,默认选择比较小的病毒库】

  • 机器配置小于3G:只选择一个小病毒库
  • 机器配置大于5G:全量加载

**问题2:**扫描卡顿,慢

  • 超过10M文件,不扫描
  • 最多只扫描10层

**问题3:**同一目录扫描,上一次未扫描完,则跳过本次扫描

病毒库文件

文件存放位置/var/lib/clamav

Plain 复制代码
276K Nov 27 16:34 bytecode.cvd 字节码库
 82M Dec 19 15:40 daily.cld 增量库
  69 Dec  6 18:32 freshclam.dat
226M Dec 17 13:45 main.cld 标准库

"曲线救国"式限制文件扫描量

值得注意的是,没有限制扫描文件数量,只有限制扫描的文件总大小

如果需要限制扫描文件数量的话,可参考如下

Bash 复制代码
【没有效果,clamscan不允许控制扫描总文件数量】
clamscan -v --max-filesize=25M --max-files=10000 --max-scansize=100M /www/wwwroot/

控制扫描文件数量
# 步骤1:取前200个写入临时列表
find /www/wwwroot/ -type f -size -10M ! -name "*.log" ! -name "*.tmp" ! -name "*.cache" | head -n 200 > /tmp/clamscan_file_list.txt

# 步骤2:扫描(结合压缩包内文件数限制--max-files=100)
clamscan -v --file-list=/tmp/clamscan_file_list.txt --max-files=100

# 步骤3:清理临时文件
rm /tmp/clamscan_file_list.txt

二、相关配置说明

clamscan指令说明

Plain 复制代码
--help                -h             // 显示此帮助信息
--version             -V             // 打印版本号
--verbose             -v             // 启用详细输出模式(显示每个文件的扫描状态)
--archive-verbose     -a             // 显示扫描的压缩包内的具体文件名
--debug                              // 启用 libclamav 库的调试日志(用于排错)
--quiet                              // 仅输出错误信息(抑制正常扫描日志)
--stdout                             // 将输出写入标准输出(stdout)而非标准错误输出(stderr),不影响调试日志的输出位置
--no-summary                         // 禁用扫描结束时的汇总信息输出
--infected            -i             // 仅打印检测到的受感染文件
--suppress-ok-results -o             // 跳过打印"扫描正常(OK)"的文件
--bell                               // 检测到病毒时触发终端响铃提醒

--tempdir=DIRECTORY                  // 在指定目录(DIRECTORY)中创建临时文件
--leave-temps[=yes/no(*)]            // 不删除扫描过程中生成的临时文件(*默认no:删除临时文件;yes:保留)
--gen-json[=yes/no(*)]               // 为扫描的文件生成 JSON 元数据(仅用于测试和开发!)
                                     // 若启用 --debug,JSON 内容会打印到终端;
                                     // 若启用 --leave-temps,JSON 文件会保存到临时目录
--database=FILE/DIR   -d FILE/DIR    // 从指定文件(FILE)加载病毒库,或从指定目录(DIR)加载所有支持的病毒库文件
--official-db-only[=yes/no(*)]       // 仅加载官方签名的病毒库(*默认no:允许加载第三方病毒库)
--log=FILE            -l FILE        // 将扫描报告保存到指定文件(FILE)
--recursive[=yes/no(*)]  -r          // 递归扫描子目录(*默认yes:开启递归;no:关闭)
--allmatch[=yes/no(*)]   -z          // 检测到匹配项后,继续扫描当前文件的剩余内容(*默认no:检测到病毒即停止扫描该文件)
--cross-fs[=yes(*)/no]               // 扫描其他文件系统上的文件和目录(*默认yes:跨文件系统扫描;no:仅扫描当前文件系统)
--follow-dir-symlinks[=0/1(*)/2]     // 跟随目录软链接(0=从不跟随;1=仅跟随直接链接*默认;2=始终跟随)
--follow-file-symlinks[=0/1(*)/2]    // 跟随文件软链接(0=从不跟随;1=仅跟随直接链接*默认;2=始终跟随)
--file-list=FILE      -f FILE        // 扫描指定文件(FILE)中列出的所有文件(批量扫描)
--remove[=yes/no(*)]                 // 删除受感染的文件(⚠️ 慎用!*默认no:不删除;yes:删除)
--move=DIRECTORY                     // 将受感染的文件移动到指定目录(DIRECTORY,用于隔离病毒)
--copy=DIRECTORY                     // 将受感染的文件复制到指定目录(DIRECTORY,用于备份)
--exclude=REGEX                      // 跳过文件名匹配指定正则表达式(REGEX)的文件
--exclude-dir=REGEX                  // 跳过目录名匹配指定正则表达式(REGEX)的目录
--include=REGEX                      // 仅扫描文件名匹配指定正则表达式(REGEX)的文件
--include-dir=REGEX                  // 仅扫描目录名匹配指定正则表达式(REGEX)的目录

--bytecode[=yes(*)/no]               // 从病毒库加载字节码特征(*默认yes:启用;no:禁用)
--bytecode-unsigned[=yes/no(*)]      // 加载未签名的字节码(*默认no:禁用)
                                     // **警告**:切勿运行来自不可信来源的字节码签名!
                                     // 此举可能导致任意代码执行(存在安全风险)
--bytecode-timeout=N                 // 设置字节码执行超时时间(单位:毫秒)
--statistics[=none(*)/bytecode/pcre] // 收集并打印执行统计信息(none*:不收集;bytecode:字节码统计;pcre:正则匹配统计)
--detect-pua[=yes/no(*)]             // 检测潜在不受欢迎程序(PUA,*默认no:禁用;yes:启用)
--exclude-pua=CAT                    // 跳过指定类别(CAT)的 PUA 特征库
--include-pua=CAT                    // 仅加载指定类别(CAT)的 PUA 特征库
--detect-structured[=yes/no(*)]      // 检测结构化数据(如社会安全号码 SSN、信用卡号)(*默认no:禁用)
--structured-ssn-format=X            // SSN(社会安全号码)格式(0=标准格式;1=无分隔符格式;2=两种格式都检测)
--structured-ssn-count=N             // 触发检测的最小 SSN 数量(需检测到 N 个以上才告警)
--structured-cc-count=N              // 触发检测的最小信用卡号数量(需检测到 N 个以上才告警)
--structured-cc-mode=X               // 信用卡检测模式(0=检测信用卡、借记卡和专用标签卡;1=仅检测信用卡)
--scan-mail[=yes(*)/no]              // 扫描邮件文件(*默认yes:启用)
--phishing-sigs[=yes(*)/no]          // 启用基于特征的钓鱼邮件检测(*默认yes:启用)
--phishing-scan-urls[=yes(*)/no]     // 启用基于 URL 特征的钓鱼邮件检测(*默认yes:启用)
--heuristic-alerts[=yes(*)/no]       // 启用启发式告警(基于行为/模式检测未知威胁,*默认yes:启用)
--heuristic-scan-precedence[=yes/no(*)] // 检测到启发式匹配项后立即停止扫描(*默认no:继续扫描;yes:停止)
--normalize[=yes(*)/no]              // 标准化 HTML、脚本和文本文件(用于精准检测;设置no可兼容 YARA 规则)
--scan-pe[=yes(*)/no]                // 扫描 PE 格式文件(Windows 可执行文件,如.exe/.dll,*默认yes:启用)
--scan-elf[=yes(*)/no]               // 扫描 ELF 格式文件(Linux/Unix 可执行文件,*默认yes:启用)
--scan-ole2[=yes(*)/no]              // 扫描 OLE2 容器文件(如老版本 Office 文档.doc/.xls,*默认yes:启用)
--scan-pdf[=yes(*)/no]               // 扫描 PDF 文件(*默认yes:启用)
--scan-swf[=yes(*)/no]               // 扫描 SWF(Flash)文件(*默认yes:启用)
--scan-html[=yes(*)/no]              // 扫描 HTML 文件(*默认yes:启用)
--scan-xmldocs[=yes(*)/no]           // 扫描基于 XML 的文档文件(*默认yes:启用)
--scan-hwp3[=yes(*)/no]              // 扫描 HWP3 格式文件(韩国韩文字处理软件文档,*默认yes:启用)
--scan-archive[=yes(*)/no]           // 扫描压缩包/归档文件(libclamav 支持的格式,如zip/tar,*默认yes:启用)
--alert-broken[=yes/no(*)]           // 对损坏的可执行文件(PE/ELF)触发告警(*默认no:禁用)
--alert-broken-media[=yes/no(*)]     // 对损坏的图片文件(JPEG/TIFF/PNG/GIF)触发告警(*默认no:禁用)
--alert-encrypted[=yes/no(*)]        // 对加密的压缩包和文档触发告警(*默认no:禁用)
--alert-encrypted-archive[=yes/no(*)] // 对加密的压缩包触发告警(*默认no:禁用)
--alert-encrypted-doc[=yes/no(*)]    // 对加密的文档触发告警(*默认no:禁用)
--alert-macros[=yes/no(*)]           // 对包含 VBA 宏的 OLE2 文件(如.doc/.xls)触发告警(*默认no:禁用)
--alert-exceeds-max[=yes/no(*)]      // 对超过最大文件大小、最大扫描大小或最大递归限制的文件触发告警(*默认no:禁用)
--alert-phishing-ssl[=yes/no(*)]     // 对包含 SSL 域名不匹配 URL 的邮件触发告警(*默认no:禁用)
--alert-phishing-cloak[=yes/no(*)]   // 对包含伪装(隐藏)URL 的钓鱼邮件触发告警(*默认no:禁用)
--alert-partition-intersection[=yes/no(*)] // 对包含分区交叉的原始 DMG 镜像文件触发告警(*默认no:禁用)
--nocerts                            // 禁用 PE 文件中 Authenticode 数字证书链的验证
--dumpcerts                          // 导出 PE 文件中的 Authenticode 数字证书链

--max-scantime=#n                    // 扫描时间超过该值则跳过文件并视为安全(单位:毫秒)
--max-filesize=#n                    // 大小超过该值的文件将被跳过并视为安全(支持单位:B/K/M/G,如10M)
--max-scansize=#n                    // 每个容器文件(如压缩包)的最大扫描数据量(解压后,**核心限制**)
--max-files=#n                       // 每个容器文件(如压缩包)内最多扫描的文件数量(**核心限制**)
--max-recursion=#n                   // 容器文件(如压缩包)的最大递归解压扫描深度(**核心限制**)
--max-dir-recursion=#n               // 目录递归扫描的最大深度
--max-embeddedpe=#n                  // 检测嵌入式 PE 文件的最大文件大小
--max-htmlnormalize=#n               // 待标准化处理的 HTML 文件的最大大小
--max-htmlnotags=#n                  // 标准化后去除标签的 HTML 文件的最大扫描大小
--max-scriptnormalize=#n             // 待标准化处理的脚本文件的最大大小
--max-ziptypercg=#n                  // 重新分析 ZIP 类型的最大文件大小
--max-partitions=#n                  // 待扫描的磁盘镜像文件中最多处理的分区数量
--max-iconspe=#n                     // PE 文件中最多扫描的图标数量
--max-rechwp3=#n                     // HWP3 文件解析函数的最大递归调用次数
--pcre-match-limit=#n                // PCRE(Perl 兼容正则)匹配函数的最大调用次数
--pcre-recmatch-limit=#n             // PCRE(Perl 兼容正则)递归匹配函数的最大调用次数
--pcre-max-filesize=#n               // 执行 PCRE 子特征匹配的文件最大大小
--disable-cache                      // 禁用已扫描文件哈希值的缓存和缓存检查

clamd配置文件

debian/Ubuntu:/etc/clamav/clamd.conf

centos/Rocky:/etc/clamd.d/scan.conf

Plain 复制代码
#Automatically Generated by clamav-daemon postinst
#To reconfigure clamd run #dpkg-reconfigure clamav-daemon
#Please read /usr/share/doc/clamav-daemon/README.Debian.gz for details
LocalSocket /var/run/clamav/clamd.ctl // 指定clamd守护进程的本地UNIX套接字路径,用于本地进程与clamd通信
FixStaleSocket true // 启用后自动删除存在但无活跃进程的陈旧套接字,重建新套接字
LocalSocketGroup clamav // 设置套接字文件所属的用户组
LocalSocketMode 666 // 套接字文件的权限(八进制),666表示所有用户/组均有读写权限
# TemporaryDirectory is not set to its default /tmp here to make overriding
# the default with environment variables TMPDIR/TMP/TEMP possible
User clamav // 运行clamd守护进程的系统用户身份
ScanMail true // 启用邮件内容扫描,检测邮件中的恶意代码/病毒
ScanArchive true // 启用压缩包(ZIP/RAR等归档文件)扫描
ArchiveBlockEncrypted false // 是否阻止加密压缩包(false=仅标记可疑,不直接阻止)
MaxDirectoryRecursion 5 // 扫描目录时允许的最大递归深度
FollowDirectorySymlinks false // 是否跟随目录软链接进行扫描
FollowFileSymlinks false // 是否跟随文件软链接进行扫描
ReadTimeout 180 // 网络客户端连接的读取超时时间(秒),超时断开
MaxThreads 12 // clamd允许的最大并发工作线程数(处理多扫描请求)
MaxConnectionQueueLength 15 // 等待处理的客户端连接最大队列长度
LogSyslog false // 是否将日志输出到系统syslog(false=仅写入指定日志文件)
LogRotate true // 启用日志轮转,防止日志文件无限增大
LogFacility LOG_LOCAL6 // 指定syslog的日志设施(仅LogSyslog=true时生效)
LogClean false // 是否记录"干净文件"的扫描日志(false=仅记录病毒/可疑文件)
LogVerbose false // 是否启用详细日志模式(false=仅记录关键信息)
PreludeEnable no // 是否集成Prelude SIEM(安全信息事件管理系统)
PreludeAnalyzerName ClamAV // Prelude集成时使用的分析器名称(仅PreludeEnable=yes生效)
DatabaseDirectory /var/lib/clamav // 病毒特征库的存储目录
OfficialDatabaseOnly false // 是否仅使用官方签名库(false=允许第三方签名库)
SelfCheck 3600 // clamd进程自我健康检查的时间间隔(秒),3600=每小时检查1次
Foreground false // 是否前台运行clamd(false=后台守护进程模式)
Debug false // 是否启用调试模式(false=关闭调试日志)
ScanPE true // 启用Windows PE可执行文件扫描
MaxEmbeddedPE 10M // 扫描PE文件时,允许嵌入的子PE文件最大大小(10兆字节)
ScanOLE2 true // 启用OLE2格式文件扫描(如Office 97-2003文档)
ScanPDF true // 启用PDF文件扫描,检测其中的恶意脚本/代码
ScanHTML true // 启用HTML文件扫描,检测恶意脚本/钓鱼链接
MaxHTMLNormalize 10M // HTML文件规范化(去标签/格式化)的最大处理大小
MaxHTMLNoTags 2M // HTML文件去除标签后,内容的最大处理大小
MaxScriptNormalize 5M // 脚本文件(JS/VBS等)规范化处理的最大大小
MaxZipTypeRcg 1M // ZIP类压缩包递归扫描的最大数据量
ScanSWF true // 启用SWF(Flash)文件扫描
ExitOnOOM true // 内存不足(OOM)时是否退出clamd(false=不退出,仅记录告警)
LeaveTemporaryFiles false // 扫描完成后是否保留临时文件(false=自动删除)
AlgorithmicDetection true // 启用启发式算法检测(基于行为/特征的非签名检测)
ScanELF true // 启用Linux ELF可执行文件扫描
IdleTimeout 30 // 空闲客户端连接的超时时间(秒),超时后断开
CrossFilesystems true // 是否跨文件系统扫描(如从ext4扫描到NTFS分区)
PhishingSignatures true // 启用钓鱼邮件特征签名检测
PhishingScanURLs true // 扫描文件/邮件中的URL,检测钓鱼链接
PhishingAlwaysBlockSSLMismatch false // 是否强制阻止SSL证书不匹配的钓鱼链接
PhishingAlwaysBlockCloak false // 是否强制阻止伪装(Cloak)的钓鱼链接
PartitionIntersection false // 是否检测跨分区的恶意文件(仅针对磁盘镜像扫描)
DetectPUA false // 是否检测潜在不受欢迎应用(PUA,如广告软件/工具栏)
ScanPartialMessages false // 是否扫描不完整的邮件消息
HeuristicScanPrecedence false // 启发式扫描是否优先于签名扫描
StructuredDataDetection false // 是否检测JSON/XML等结构化数据中的恶意内容
CommandReadTimeout 30 // 读取客户端命令的超时时间(秒)
SendBufTimeout 200 // 向客户端发送数据的缓冲区超时时间(毫秒)
MaxQueue 100 // 等待扫描的任务最大队列长度
ExtendedDetectionInfo true // 是否在检测结果中包含扩展信息(如病毒变种/位置)
OLE2BlockMacros false // 是否阻止OLE2文件中的宏(false=仅标记,不直接阻止)
AllowAllMatchScan true // 是否允许扫描时匹配所有可用签名(true=全面扫描)
ForceToDisk false // 是否强制将大文件写入磁盘后再扫描(false=优先内存扫描)
DisableCertCheck false // 是否禁用SSL证书校验(仅特征库更新等场景生效)
DisableCache false // 是否禁用扫描缓存(false=启用缓存,提升重复文件扫描速度)
MaxScanTime 120000 // 单个文件的最大扫描耗时(毫秒),120000=2分钟
MaxScanSize 100M // 单次扫描任务的最大总数据量(100兆字节)
MaxFileSize 10M // 单个文件的最大扫描大小(超过则跳过)
MaxRecursion 16 // 压缩包/归档文件的最大递归解压深度
MaxFiles 10000 // 单个归档文件中最多扫描的文件数量
MaxPartitions 50 // 扫描磁盘镜像时允许的最大分区数量
MaxIconsPE 100 // PE文件中最多扫描的图标数量(防止恶意图标注入)
PCREMatchLimit 10000 // PCRE正则表达式匹配的最大次数(防止DoS攻击)
PCRERecMatchLimit 5000 // PCRE正则表达式递归匹配的最大次数
PCREMaxFileSize 25M // 使用PCRE正则扫描的文件最大大小
ScanXMLDOCS true // 启用XML文档扫描
ScanHWP3 true // 启用韩版Office HWP3文件扫描
MaxRecHWP3 10 // HWP3文件的最大递归扫描深度
StreamMaxLength 10M // 流式扫描的最大数据长度(10兆字节)
LogFile /var/log/clamav/clamav.log // 扫描日志文件的存储路径
LogTime true // 是否在日志中添加时间戳
LogFileUnlock false // 是否每次写入日志后解锁文件(false=保持锁定,提升写入效率)
LogFileMaxSize 0 // 日志文件的最大大小(0=不限制,依赖LogRotate轮转)
Bytecode true // 启用字节码签名(动态加载的检测规则)
BytecodeSecurity TrustSigned // 字节码安全策略:仅信任官方签名的字节码
BytecodeTimeout 60000 // 字节码执行的超时时间(毫秒),60000=1分钟
OnAccessMaxFileSize 5M // 实时访问扫描(On-Access)时单个文件的最大大小

clamdscan指令说明

Plain 复制代码
    clamdscan [options] [file/directory/-]
    --help              -h             // 显示此帮助信息 中文
    --version           -V             // 显示版本号并退出
    --verbose           -v             // 详细输出,包括扫描进度
    --quiet                            // 仅输出错误信息,不显示进度
    --stdout                           // 将输出写入标准输出(stdout),而不是标准错误(stderr)。不会影响 'debug' 消息。
                                       (this help is always written to stdout)
    --log=FILE          -l FILE        // 将扫描报告保存到 FILE 文件中
    --file-list=FILE    -f FILE        // 从 FILE 文件中读取要扫描的文件列表
    --ping              -p A[:I]       // 尝试最多 A 次,可选间隔 I 秒,直到 clamd 响应。
    --wait              -w             // 最多等待 30 秒,直到 clamd 启动。可选搭配 --ping 来设置尝试次数 [A] 和间隔 [I] 来检查 clamd。
    --remove                           // 删除感染文件。小心操作!
    --move=DIRECTORY                   // 将感染文件移动到 DIRECTORY 目录中
    --copy=DIRECTORY                   // 将感染文件复制到 DIRECTORY 目录中
    --config-file=FILE                 // 从 FILE 文件中读取配置
    --allmatch            -z           // 找到匹配后继续扫描文件中的其他内容
    --multiscan           -m           // 强制 MULTISCAN 模式,即使找到匹配也继续扫描
    --infected            -i           // 仅打印感染文件
    --no-summary                       // 禁用扫描结束时的摘要信息
    --reload                           // 请求 clamd 重新加载病毒数据库
    --fdpass                           // 传递文件描述符给 clamd(如果 clamd 以不同用户运行)
    --stream                           // 强制将文件流式传输给 clamd(用于调试和单元测试)

clamdscan扫描 过滤掉指定文件类型或者指定目录

配置项 作用域 优点 缺点
ExcludePath 全局(clamdscan/实时扫描) 支持正则,功能强大 需要正则知识
ExcludeExtension 全局(clamdscan/实时扫描) 配置简单直观 对压缩包内文件无效,不支持通配符
--exclude 参数 仅 clamscan 可用 命令行灵活控制 clamdscan 不支持
Plain 复制代码
ExcludePath \.(mp4|mp3|avi|mkv|mov|wav|flac)$
ExcludePath \.(jpg|jpeg|png|gif|bmp|ico)$
ExcludePath \.(iso|tar\.gz|tar\.bz2|zip|rar|7z|tgz)$

三、ClamAV配置优化

clamdscan最佳配置

debian/ubuntu:/etc/clamav/clamd.conf

centos:/etc/clamd.d/scan.conf

Plain 复制代码
# ================================
# 性能核心参数(最重要)
# ================================
# 并发线程控制 - 根据CPU核心数调整
MaxThreads 4  # 4核CPU=2线程,8核CPU=4线程,16核CPU=8线程
# 连接和队列管理
MaxConnectionQueueLength 10  # 降低连接队列长度
MaxQueue 50  # 减少等待扫描队列长度

# ================================
# 内存控制参数(重要)
# ================================
# 文件大小限制 - 平衡安全性和性能
MaxFileSize 5M   # 单文件最大扫描大小
MaxScanSize 50M  # 单次扫描任务最大数据量
MaxScanTime 90000  # 单文件最大扫描时间(90秒)

# HTML和脚本文件处理限制
MaxHTMLNormalize 5M  # HTML文件最大归一化大小
MaxHTMLNoTags 1M    # HTML文件最大无标签大小
MaxScriptNormalize 3M  # 脚本文件最大归一化大小

# ================================
# 扫描功能控制(根据需求调整)
# ================================
# 启用/禁用扫描功能
ScanMail false     # 非邮件服务器可关闭
ScanArchive true   # 保持开启但限制深度
ScanPE true        # PE文件扫描(重要)
ScanOLE2 true      # Office文档扫描(重要)
ScanHTML true      # HTML文件扫描
ScanPDF true       # PDF文件扫描

# 递归深度控制
MaxDirectoryRecursion 8  # 目录递归深度,默认8层
MaxRecursion 8           # 压缩包递归深度
MaxFiles 5000            # 单个归档文件内最大文件数

# ================================
# 缓存和性能优化
# ================================
DisableCache false       # 启用缓存(重要)
ForceToDisk false        # 内存优先处理

# ================================
# 安全检测调优
# ================================
AlgorithmicDetection true     # 启发式检测(平衡安全性和性能)
HeuristicScanPrecedence false # 签名优先于启发式
DetectPUA false              # 关闭PUA检测(可节省资源)
PhishingSignatures true      # 保持钓鱼检测

# ================================
# 字节码和时间控制
# ================================
BytecodeTimeout 30000      # 字节码执行超时(30秒)
SelfCheck 3600            # 健康检查间隔(1小时)

# ================================
# 资源保护参数
# ================================
ExitOnOOM true            # 内存不足时退出(保护系统)
MaxEmbeddedPE 5M          # PE文件嵌入子文件大小
PCREMatchLimit 8000       # 正则匹配次数限制
PCREMaxFileSize 20M       # PCRE扫描文件大小限制

<!-- 排除掉一些文件类型:zip、jpg、jpeg、png、PDF、JPG、JPEG、ZIP -->
ExcludePath \.(mp4|mp3|avi|mkv|mov|wav|flac)$
ExcludePath \.(jpg|jpeg|png|gif|bmp|ico)$
ExcludePath \.(iso|tar\.gz|tar\.bz2|zip|rar|7z|tgz)$

clamscan最佳配置

Plain 复制代码
clamscan \
  --max-filesize=5M \ // 单文件最大扫描大小
  --max-scantime=30000 \ // 单文件最大扫描时间(30秒)
  --max-scansize=50M \  // 单次扫描任务最大数据量
  --max-dir-recursion=8 \ // 目录递归深度,最多8层
  --max-recursion=8 \ // 压缩包递归深度
  --max-files=5000 \  // 单个归档文件内最大文件数
  --max-htmlnormalize=5M \ // HTML文件最大归一化大小
  --max-htmlnotags=2M   // 标准化后去除标签的 HTML 文件的最大扫描大小
  --max-scriptnormalize=3M \ // 脚本文件最大归一化大小
  --pcre-max-filesize=25M  // 执行 PCRE 子特征匹配的文件最大大小
  --max-embeddedpe=10M   // 检测嵌入式 PE 文件的最大文件大小
  --detect-pua=no \  // 关闭PUA检测(可节省资源)
  --scan-mail=no \  // 关闭邮件扫描(非邮件服务器可关闭)
  --suppress-ok-results \  // 抑制正常文件结果 
  --infected \  // 仅显示感染文件
  --exclude=pdf$ --exclude=jpg$ --exclude=jpeg$ --exclude=png$ --exclude=PDF$ --exclude=JPG$ --exclude=JPEG$ --exclude=zip$ // 排除PDF、JPG、JPEG、PNG、ZIP文件扫描

  /path/to/scan

四、效果对比

测试1

原来: /www/test/ 22.1s 5663 662

优化后:/www/test/ 150.8s 5661 662

效果:测试近6k个文件,时间从150s减少到22s,扫描速度提升了6.5倍,而且检测效果一样。

测试2

效果:测试19w个文件,扫描时间从3901.45s减少到2158.41s,扫描速度提升了1.7倍,而且检测效果基本一致。

原来:/ 3901.45s 197020 1353

优化后:/ 2158.41s 198513 1344

原始测试数据参考

Plain 复制代码
300w文件,大概60分钟
----------- SCAN SUMMARY -----------
Known viruses: 3626944
Engine version: 1.0.9
Scanned directories: 31170
Scanned files: 195297
Infected files: 1353
Data scanned: 5008.75 MB
Data read: 5114.15 MB (ratio 0.98:1)
Time: 4076.971 sec (67 m 56 s)
Start Date: 2025:12:19 18:03:54
End Date:   2025:12:19 19:11:51

1w个文件, 近30分钟
----------- SCAN SUMMARY -----------
Known viruses: 3626992
Engine version: 1.0.9
Scanned directories: 0
Scanned files: 99679
Infected files: 14
Data scanned: 1709.46 MB
Data read: 1653.57 MB (ratio 1.03:1)
Time: 1659.128 sec (27 m 39 s)
Start Date: 2025:12:20 16:14:06
End Date:   2025:12:20 16:41:45

越大文件,扫描速度越慢
相关推荐
kaoa0002 小时前
Linux入门攻坚——58、varnish入门
linux·运维·服务器
安当加密2 小时前
通过ASP认证系统作为 RADIUS 认证服务器:解决异地办公登录安全问题的实践方案*
运维·服务器·安全
gaize12132 小时前
服务器的用途:多元化应用与无限可能
运维·服务器
handsome_sai7 小时前
【Java 线程池】记录
java
大学生资源网8 小时前
基于springboot的唐史文化管理系统的设计与实现源码(java毕业设计源码+文档)
java·spring boot·课程设计
guslegend8 小时前
SpringSecurity源码剖析
java
roman_日积跬步-终至千里9 小时前
【人工智能导论】02-搜索-高级搜索策略探索篇:从约束满足到博弈搜索
java·前端·人工智能
Xの哲學9 小时前
Linux流量控制: 内核队列的深度剖析
linux·服务器·算法·架构·边缘计算
大学生资源网9 小时前
java毕业设计之儿童福利院管理系统的设计与实现(源码+)
java·开发语言·spring boot·mysql·毕业设计·源码·课程设计