I had a similar problem with a recently acquired SYS-5019S-TN4 that uses the X11SSV-M4F. It was running LOUD at idle. I could get the IPMI raw commands to get it to a healthy noise level .. but then it would stay there when under load .. and so I figured I would put together a little script. It is working for me and thought it was a good little give back to the world as I am only as good as the information I get .. and forums like this help a mediocre techie way outperform his gifts. This box was in a windows environment so I put it together as a PowerShell Script. feel free to use and share. I might go back and do a full PID loop for it but as of now I just go into Quiet Mode when the CPU is below the threshold (currently 50C) and goes into "standard" fan mode (ramps from 45% to 100% based on IPMI temps) above a threshold (currently 53C).. then when it drops back below the quiet temp it goes back to the quiet mode. this assumes you have the SuperMicro Tool IPMICFG-Win.exe in the Path of your windows install. you can tune the switchover points of 50 53 as well as the quiet mode level I currently have at 0x06 but that is MB specific and can be 0-64 or 00-FF depending .. just play around with that command before you load this on startup.
Code:
# Function to get CPU temperature using IPMI
function GetCpuTemperatureFromIPMI {
$ipmiOutput = & "ipmicfg-win.exe" -sdr
$cpuTemp = $ipmiOutput | Where-Object { $_ -match '\(4\) CPU Temp\s+\|\s+(\d+(?:\.\d+)?)C/' } | ForEach-Object { $matches[1] }
return [double]$cpuTemp
}
# Function to set fan mode to auto using IPMICFG-Win.exe
function SetFanModeAuto() {
Start-Process -FilePath "IPMICFG-Win.exe" -ArgumentList "-fan 0" -Wait
}
# Function to set fan mode to quiet using IPMICFG-Win.exe
function SetFanModeQuiet() {
Start-Process -FilePath "IPMICFG-Win.exe" -ArgumentList "-fan 1" -Wait
Start-Process -FilePath "IPMICFG-Win.exe" -ArgumentList "-raw 0x30 0x70 0x66 0x01 0x00 0x06" -Wait
}
# Main script logic
try {
$currentFanMode = $null # Variable to store the current fan mode
while ($true) {
$cpuTemperature = GetCpuTemperatureFromIPMI
if ($currentFanMode -ne 1 -and $cpuTemperature -lt 50) {
SetFanModeQuiet
$currentFanMode = 1 # Set the current fan mode to quiet (1)
Write-Host "CPU temperature is below 50°C. Fan mode set to quiet."
} elseif ($currentFanMode -ne 0 -and $cpuTemperature -ge 53) {
SetFanModeAuto
$currentFanMode = 0 # Set the current fan mode to auto (0)
Write-Host "CPU temperature is above 53°C. Fan mode set to auto."
}
# Wait for 20 seconds before the next check
Start-Sleep -Seconds 20
}
} catch {
Write-Host "Error occurred: $_"
}