loadTest.js 2.8 KB

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