loadTest.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { fetchNothing } from '@overleaf/fetch-utils'
  2. import Settings from '@overleaf/settings'
  3. import async from 'async'
  4. import fs from 'node:fs'
  5. import _ from 'lodash'
  6. const concurentCompiles = 5
  7. const totalCompiles = 50
  8. const buildUrl = path =>
  9. `http://${Settings.internal.clsi.host}:${Settings.internal.clsi.port}/${path}`
  10. const mainTexContent = fs.readFileSync('./bulk.tex', 'utf-8')
  11. const compileTimes = []
  12. let failedCount = 0
  13. const getAverageCompileTime = function () {
  14. const totalTime = _.reduce(compileTimes, (sum, time) => sum + time, 0)
  15. return totalTime / compileTimes.length
  16. }
  17. const makeRequest = async function (compileNumber) {
  18. let bulkBodyCount = 7
  19. let bodyContent = ''
  20. while (--bulkBodyCount) {
  21. bodyContent = bodyContent += mainTexContent
  22. }
  23. const startTime = new Date()
  24. try {
  25. await fetchNothing(
  26. buildUrl(`project/loadcompile-${compileNumber}/compile`),
  27. {
  28. method: 'POST',
  29. json: {
  30. compile: {
  31. resources: [
  32. {
  33. path: 'main.tex',
  34. content: `\
  35. \\documentclass{article}
  36. \\begin{document}
  37. ${bodyContent}
  38. \\end{document}\
  39. `,
  40. },
  41. ],
  42. },
  43. },
  44. }
  45. )
  46. const totalTime = new Date() - startTime
  47. console.log(totalTime + 'ms')
  48. compileTimes.push(totalTime)
  49. } catch (error) {
  50. console.log({ error })
  51. failedCount++
  52. throw new Error(`compile ${compileNumber} failed`)
  53. }
  54. }
  55. const jobs = []
  56. for (let i = 0; i < totalCompiles; i++) {
  57. jobs.push(() => makeRequest(i))
  58. }
  59. const runJob = (job, _, cb) =>
  60. job()
  61. .then(() => cb())
  62. .catch(err => cb(err))
  63. async function run() {
  64. const startTime = new Date()
  65. await async.eachOfLimit(jobs, concurentCompiles, runJob)
  66. console.log(`total time taken = ${(new Date() - startTime) / 1000}s`)
  67. console.log(`total compiles = ${totalCompiles}`)
  68. console.log(`concurent compiles = ${concurentCompiles}`)
  69. console.log(`average time = ${getAverageCompileTime() / 1000}s`)
  70. console.log(`max time = ${_.max(compileTimes) / 1000}s`)
  71. console.log(`min time = ${_.min(compileTimes) / 1000}s`)
  72. console.log(`total failures = ${failedCount}`)
  73. }
  74. run()
  75. .then(() => process.exit(0))
  76. .catch(error => {
  77. console.error(error)
  78. process.exit(1)
  79. })