loadTest.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /* eslint-disable
  2. standard/no-callback-literal,
  3. */
  4. // TODO: This file was created by bulk-decaffeinate.
  5. // Fix any style issues and re-enable lint.
  6. /*
  7. * decaffeinate suggestions:
  8. * DS102: Remove unnecessary code created because of implicit returns
  9. * DS207: Consider shorter variations of null checks
  10. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  11. */
  12. const request = require('request')
  13. const Settings = require('settings-sharelatex')
  14. const async = require('async')
  15. const fs = require('fs')
  16. const _ = require('lodash')
  17. const concurentCompiles = 5
  18. const totalCompiles = 50
  19. const buildUrl = (path) =>
  20. `http://${Settings.internal.clsi.host}:${Settings.internal.clsi.port}/${path}`
  21. const mainTexContent = fs.readFileSync('./bulk.tex', 'utf-8')
  22. const compileTimes = []
  23. let failedCount = 0
  24. const getAverageCompileTime = function () {
  25. const totalTime = _.reduce(compileTimes, (sum, time) => sum + time, 0)
  26. return totalTime / compileTimes.length
  27. }
  28. const makeRequest = function (compileNumber, callback) {
  29. let bulkBodyCount = 7
  30. let bodyContent = ''
  31. while (--bulkBodyCount) {
  32. bodyContent = bodyContent += mainTexContent
  33. }
  34. const startTime = new Date()
  35. return request.post(
  36. {
  37. url: buildUrl(`project/loadcompile-${compileNumber}/compile`),
  38. json: {
  39. compile: {
  40. resources: [
  41. {
  42. path: 'main.tex',
  43. content: `\
  44. \\documentclass{article}
  45. \\begin{document}
  46. ${bodyContent}
  47. \\end{document}\
  48. `
  49. }
  50. ]
  51. }
  52. }
  53. },
  54. (err, response, body) => {
  55. if (response.statusCode !== 200) {
  56. failedCount++
  57. return callback(`compile ${compileNumber} failed`)
  58. }
  59. if (err != null) {
  60. failedCount++
  61. return callback('failed')
  62. }
  63. const totalTime = new Date() - startTime
  64. console.log(totalTime + 'ms')
  65. compileTimes.push(totalTime)
  66. return callback(err)
  67. }
  68. )
  69. }
  70. const jobs = _.map(__range__(1, totalCompiles, true), (i) => (cb) =>
  71. makeRequest(i, cb)
  72. )
  73. const startTime = new Date()
  74. async.parallelLimit(jobs, concurentCompiles, (err) => {
  75. if (err != null) {
  76. console.error(err)
  77. }
  78. console.log(`total time taken = ${(new Date() - startTime) / 1000}s`)
  79. console.log(`total compiles = ${totalCompiles}`)
  80. console.log(`concurent compiles = ${concurentCompiles}`)
  81. console.log(`average time = ${getAverageCompileTime() / 1000}s`)
  82. console.log(`max time = ${_.max(compileTimes) / 1000}s`)
  83. console.log(`min time = ${_.min(compileTimes) / 1000}s`)
  84. return console.log(`total failures = ${failedCount}`)
  85. })
  86. function __range__(left, right, inclusive) {
  87. const range = []
  88. const ascending = left < right
  89. const end = !inclusive ? right : ascending ? right + 1 : right - 1
  90. for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
  91. range.push(i)
  92. }
  93. return range
  94. }