From 0b0416aca1cd0fb8e37508a4b9c5915b17cf5423 Mon Sep 17 00:00:00 2001 From: Peter Mounce Date: Fri, 1 May 2015 20:28:56 +0100 Subject: [PATCH 1/4] Create win_dotnet_ngen module When .NET is installed or updated, ngen is triggered to optimise the installation. This triggers high CPU while it's happening, and usually happens at an inconvenient time. This allows you to trigger it when you like. Full details and background in doc. I don't know a way to figure out whether this is required without actually running it. --- windows/win_dotnet_ngen.ps1 | 69 +++++++++++++++++++++++++++++++++++++ windows/win_dotnet_ngen.py | 43 +++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 windows/win_dotnet_ngen.ps1 create mode 100644 windows/win_dotnet_ngen.py diff --git a/windows/win_dotnet_ngen.ps1 b/windows/win_dotnet_ngen.ps1 new file mode 100644 index 00000000000..52b4ebf82d5 --- /dev/null +++ b/windows/win_dotnet_ngen.ps1 @@ -0,0 +1,69 @@ +#!powershell +# This file is part of Ansible +# +# Copyright 2015, Peter Mounce +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + +$ErrorActionPreference = "Stop" + +# WANT_JSON +# POWERSHELL_COMMON + +$params = Parse-Args $args; +$result = New-Object PSObject; +Set-Attr $result "changed" $false; + +function Invoke-NGen +{ + [CmdletBinding()] + + param + ( + [Parameter(Mandatory=$false, Position=0)] [string] $arity = "" + ) + + if ($arity -eq $null) + { + $arity = "" + } + $cmd = "$($env:windir)\microsoft.net\framework$($arity)\v4.0.30319\ngen.exe" + if (test-path $cmd) + { + $update = Invoke-Expression "$cmd update /force"; + Set-Attr $result "dotnet_ngen$($arity)_update_exit_code" $lastexitcode + Set-Attr $result "dotnet_ngen$($arity)_update_output" $update + $eqi = Invoke-Expression "$cmd executequeueditems"; + Set-Attr $result "dotnet_ngen$($arity)_eqi_exit_code" $lastexitcode + Set-Attr $result "dotnet_ngen$($arity)_eqi_output" $eqi + + $result.changed = $true + } + else + { + Write-Host "Not found: $cmd" + } +} + +Try +{ + Invoke-NGen + Invoke-NGen -arity "64" + + Exit-Json $result; +} +Catch +{ + Fail-Json $result $_.Exception.Message +} diff --git a/windows/win_dotnet_ngen.py b/windows/win_dotnet_ngen.py new file mode 100644 index 00000000000..d3dc4622e7c --- /dev/null +++ b/windows/win_dotnet_ngen.py @@ -0,0 +1,43 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# (c) 2015, Peter Mounce +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + +# this is a windows documentation stub. actual code lives in the .ps1 +# file of the same name + +DOCUMENTATION = ''' +--- +module: win_dotnet_ngen +version_added: "1.9" +short_description: Runs ngen to recompile DLLs after .NET updates +description: + - After .NET framework is installed/updated, Windows will probably want to recompile things to optimise for the host. + - This happens via scheduled task, usually at some inopportune time. + - This module allows you to run this task on your own schedule, so you incur the CPU hit at some more convenient and controlled time. + - http://blogs.msdn.com/b/dotnet/archive/2013/08/06/wondering-why-mscorsvw-exe-has-high-cpu-usage-you-can-speed-it-up.aspx + - Note: there are in fact two scheduled tasks for ngen but they have no triggers so aren't a problem + - Note: there's no way to test if they've been completed (?) +options: +author: Peter Mounce +''' + +EXAMPLES = ''' + # Run ngen tasks + win_dotnet_ngen: +''' From ddb85479cd79417ff0df345a9fae20ffb84b21b0 Mon Sep 17 00:00:00 2001 From: Peter Mounce Date: Sat, 2 May 2015 13:33:38 +0100 Subject: [PATCH 2/4] Add documentation note --- windows/win_dotnet_ngen.py | 1 + 1 file changed, 1 insertion(+) diff --git a/windows/win_dotnet_ngen.py b/windows/win_dotnet_ngen.py index d3dc4622e7c..c6c1c6de069 100644 --- a/windows/win_dotnet_ngen.py +++ b/windows/win_dotnet_ngen.py @@ -33,6 +33,7 @@ description: - http://blogs.msdn.com/b/dotnet/archive/2013/08/06/wondering-why-mscorsvw-exe-has-high-cpu-usage-you-can-speed-it-up.aspx - Note: there are in fact two scheduled tasks for ngen but they have no triggers so aren't a problem - Note: there's no way to test if they've been completed (?) + - Note: the stdout is quite likely to be several megabytes options: author: Peter Mounce ''' From 52a87e16379edf21c46bf45725694cad4c5a91f5 Mon Sep 17 00:00:00 2001 From: Peter Mounce Date: Wed, 6 May 2015 21:51:05 +0100 Subject: [PATCH 3/4] version -> 2, quote doc strings with colons --- windows/win_dotnet_ngen.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/windows/win_dotnet_ngen.py b/windows/win_dotnet_ngen.py index c6c1c6de069..5f6d45062d6 100644 --- a/windows/win_dotnet_ngen.py +++ b/windows/win_dotnet_ngen.py @@ -24,15 +24,15 @@ DOCUMENTATION = ''' --- module: win_dotnet_ngen -version_added: "1.9" +version_added: "2.0" short_description: Runs ngen to recompile DLLs after .NET updates description: - After .NET framework is installed/updated, Windows will probably want to recompile things to optimise for the host. - This happens via scheduled task, usually at some inopportune time. - This module allows you to run this task on your own schedule, so you incur the CPU hit at some more convenient and controlled time. - - http://blogs.msdn.com/b/dotnet/archive/2013/08/06/wondering-why-mscorsvw-exe-has-high-cpu-usage-you-can-speed-it-up.aspx - - Note: there are in fact two scheduled tasks for ngen but they have no triggers so aren't a problem - - Note: there's no way to test if they've been completed (?) + - "http://blogs.msdn.com/b/dotnet/archive/2013/08/06/wondering-why-mscorsvw-exe-has-high-cpu-usage-you-can-speed-it-up.aspx" + - "Note: there are in fact two scheduled tasks for ngen but they have no triggers so aren't a problem" + - "Note: there's no way to test if they've been completed (?)" - Note: the stdout is quite likely to be several megabytes options: author: Peter Mounce From c32262732013e2177dd4779be4984ffb580dea9e Mon Sep 17 00:00:00 2001 From: Peter Mounce Date: Sat, 9 May 2015 11:01:46 +0100 Subject: [PATCH 4/4] use the notes property --- windows/win_dotnet_ngen.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/windows/win_dotnet_ngen.py b/windows/win_dotnet_ngen.py index 5f6d45062d6..90f464a1b0b 100644 --- a/windows/win_dotnet_ngen.py +++ b/windows/win_dotnet_ngen.py @@ -31,9 +31,10 @@ description: - This happens via scheduled task, usually at some inopportune time. - This module allows you to run this task on your own schedule, so you incur the CPU hit at some more convenient and controlled time. - "http://blogs.msdn.com/b/dotnet/archive/2013/08/06/wondering-why-mscorsvw-exe-has-high-cpu-usage-you-can-speed-it-up.aspx" - - "Note: there are in fact two scheduled tasks for ngen but they have no triggers so aren't a problem" - - "Note: there's no way to test if they've been completed (?)" - - Note: the stdout is quite likely to be several megabytes +notes: + - there are in fact two scheduled tasks for ngen but they have no triggers so aren't a problem + - there's no way to test if they've been completed (?) + - the stdout is quite likely to be several megabytes options: author: Peter Mounce '''