- Totara Social is supported on Windows OS but does not support IIS or SQL server.
- Totara Learn fully supports hosting on a Windows OS, IIS as a web server and using SQL server as the database engine. However there are a number of caveats and limitations which specifically impact Totara Learn sites hosted in a Microsoft environment. These are explained in more detail below.
General issues due to Totara staff and client preference
All supported platforms are throughly tested both automatically (unit tests and acceptance tests) and manually during the release process.
However, in addition to our formal testing it is not unusual for Totara staff to report issues that they discover in the course of their daily work. Since the majority of our developers and support staff use PostgreSQL or MySQL for their local installations, those databases are indirectly tested the most.
In addition, the vast majority of our clients deploy to Linux servers running PostgreSQL or MySQL. The increased usage of those platforms means that Totara Learn is more "battle-tested" on those platforms. Obscure bugs in rarely used areas are more likely to have been uncovered reported and fixed on the more commonly used platforms.
That means that a site running on Microsoft technology may be more prone to discovering platform specific issues than the same site running a more common configuration.
Totara Learn and Totara Social on Windows
- Execution timeout uses different logic
- File locking is incomplete and different - can lead to file related problems
- Open files cannot be deleted
- Integer are 32 bits long - no support for large files > 2GB, problem with ids in large tables, random integer overflows
- Very limited date support (1970-2038) - caused by 32 bit integers and other restrictions
- Process related API are not implemented
- No support for sockets
- Unicode problems with file names in Windows file systems
In addition Totara Learn has a number of Windows-specific limitations:
- No support for shares with \\ at the beginning of file paths in settings or dataroot
- Different path separator - this can lead to Windows-specific bugs if developers aren't careful
- Most large installs use memcache server for caching - it is not production ready on Windows
- Limited support for CLI - compatibility problems with some shell emulations
- File name case insensitivity problems - this can lead to Windows-specific bugs if developers aren't careful
Totara Learn served via IIS
- Simple error pages need to be disabled
- Default script timeout is too short - it needs to be hours, not minutes
- ignore_user_abort() not supported
- Shutdown handlers do not seem to work in some situations - possible data loss and corruption
- slasharguments do not work well - problems with unicode chars, tricky rewriting configuration
- Some PHP extensions may not compatible with Non-Thread-Safe PHP that is recommended for IIS - can lead to bugs and crashes, but nobody knows exactly what the problems are
- No X-Sendfile mechanism - low performance when serving large files
Totara Learn using SQL Server (MSSQL) as the database engine
PHP database driver extension
The PostgreSQL extension is part of the core PHP distribution, is tested thoroughly on all platforms and is used much more widely than either the native or FreeTDS MSSQL drivers. Both MSSQL drivers have in the past presented compatibility and stability concerns with PHP applications that wish to make use of extended MSSQL functionality.
Recordset and transaction handling
Both recordsets and transactions are used extensively by Totara and the two handle the combination very differently. For a long time MSSQL did not support concurrent recordsets, to solve this Microsoft introduced Multiple Active Result Sets (codenamed MARS) which facilitated handling multiple recordsets with some pretty extreme limitations. One of these limitations in the PHP MSSQL driver is that recordsets cannot be used within transactions. The official MSSQL (native) PHP driver does not support MARS, in order to provide the required concurrent recordsets required by Totara and to facilitate their use within transactions we must emulate this layer in memory.
The unofficial FreeTDS driver available for MSSQL does a better job with MARS but is doing what we do in Totara for the native driver behind the scenes, essentially reading the recordset into memory. In both cases the cost of this is a much higher memory use when using MSSQL than when using Postgresql or MySQL. On small sites (<1000 users) this will not be an issue, however on larger installations or installations with minimally speced hardware this can lead to significant memory and performance issues.
Recordset and temporary tables
Like the above problem there is an issue when using both recordset and temporary tables. The two cannot be used at the same time so in order to facilitate the writing to a temporary table whilst processing a recordset the entire recordset for MSSQL must be read into memory and then fed into the temporary table, OR done in chunks. The cost of this is a slow experience in MSSQL when using some of the more technical areas of Totara such as backup and restore, HR import, statistics, and LDAP.
Totara Learn performance comparison
In order to quantify the performance differences between our recommended platform and a Microsoft technology stack we performed some performance and load testing of both platforms. The zip file below contains a full report on the testing infrastructure, methodology and detailed results:
- MSSQL on Windows required approximately 2.6 times as much memory, and took approximately 2.6 times longer to perform the same tasks as PostgreSQL on Linux.
- Attempts to run actions on ~50,000 users lead to fatal out of memory errors on MSSQL
Both of these problems were caused by the MSSQL driver issues outlined above.