{"id":777,"date":"2014-01-29T15:23:02","date_gmt":"2014-01-29T13:23:02","guid":{"rendered":"http:\/\/oldblogs.uct.ac.za\/blog\/big-bytes\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud"},"modified":"2015-08-14T11:34:55","modified_gmt":"2015-08-14T09:34:55","slug":"dynamic-memory-allocation-in-the-cloud","status":"publish","type":"post","link":"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/","title":{"rendered":"Dynamic memory allocation in the cloud"},"content":{"rendered":"<div>Over the last week we've been testing our new Hyper-V cloud based HPC architecture. \u00a0While our 600 series architecture is economical in that there are many cores per server, this forces users to share the same memory space which can lead to contention as our scheduler cannot reserve RAM, and once a job is running the only way to protect memory from a RAM hungry process is to kill it. \u00a0The cloud based HPC servers can be created on the fly, carved out of whatever resources are available in the Hyper-V environment, in a variety of forms. \u00a0For instance we can create twenty 4 core servers with 8GB of RAM each, then delete them and for another user create ten 4 core servers with 16GB of RAM each. \u00a0The resources are thin provisioned so the system can be over subscribed, within reason. \u00a0So now, instead of having to reserve 64 cores for a user who only needs 1 core but as much RAM as possible we can tailor make an environment that does not hog resources.<\/div>\r\n<div>In addition to this Hyper-V has the ability to dynamically increase RAM to a virtualised operating system which, once again within reason, allows us to oversubscribe our cloud environment. \u00a0Below is a simple test using a perl script to fill up the worker node's RAM. \u00a0The server starts with 8GB of RAM, 100% of which is available. \u00a0As the RAM is allocated the total amount of RAM on the worker node is dynamically increased up to 17GB.<\/div>\r\n<div><img src=\"https:\/\/ucthpc.uct.ac.za\/wp-content\/uploads\/2015\/07\/RAM.jpg\" alt=\"RAM\" border=\"0\" \/><\/div>\r\n<div>Below is a screen shot of our dashboard showing two servers which were initially identical, hpc701 now has double the RAM.<\/div>\r\n<div><img src=\"https:\/\/ucthpc.uct.ac.za\/wp-content\/uploads\/2015\/07\/dynamicRAM.png\" alt=\"dynamic RAM\" border=\"0\" \/><\/div>\r\n<div>One of the disadvantages is lack of NUMA. \u00a0NUMA, or non uniform memory access groups CPUs and RAM by shortest physical access path on the motherboard, ensuring fast computations. \u00a0A server supporting NUMA will allow NUMA aware software to generally outperform software that cannot select the optimum chip geometry. \u00a0Windows 2012 R2 supports NUMA, however this is\u00a0<a href=\"http:\/\/technet.microsoft.com\/en-us\/library\/dn282282.aspx#bkmk_NUMA_Spanning\">disabled when dynamic memory allocation<\/a>\u00a0is enabled as the hypervisor cannot guarantee optimum geometry for future RAM expansion in a dynamic environment.<\/div>\r\n<div>Another issue we ran into is the speed at which the RAM is allocated in that several times the worker node ran out of RAM before the hypervisor could allocate additional RAM.<\/div>\r\n<div><\/div>","protected":false},"excerpt":{"rendered":"<div>Over the last week we&#8217;ve been testing our new Hyper-V cloud based HPC architecture. &nbsp;While our 600 series architecture is economical in that there are many cores per server, this forces users to share the same memory space which can lead to contention as our scheduler cannot reserve RAM, and once a job is running the only way to protect memory from a RAM hungry process is to kill it. &nbsp;The cloud based HPC servers can be created on the fly, carved out of whatever resources are available in the Hyper-V environment, in a variety of forms. &nbsp;For instance we can create twenty 4 core servers with 8GB of RAM each, then delete them and for another user create ten 4 core servers with 16GB of RAM each. &nbsp;The resources are thin provisioned so the system can be over subscribed, within reason. &nbsp;So now, instead of having to reserve 64 cores for a user who only needs 1 core but as much RAM as possible we can tailor make an environment that does not hog resources.<\/div>\n<div>In addition to this Hyper-V has the ability to dynamically increase RAM to a virtualised operating system which, once again within reason, allows us to oversubscribe our cloud environment. &nbsp;Below is a simple test using a perl script to fill up the worker node&#8217;s RAM. &nbsp;The server starts with 8GB of RAM, 100% of which is available. &nbsp;As the RAM is allocated the total amount of RAM on the worker node is dynamically increased up to 17GB.<\/div>\n<div><img decoding=\"async\" src=\"http:\/\/blogs.uct.ac.za\/gallery\/1253\/RAM.jpg\" border=\"0\" alt=\"RAM\"><\/div>\n<div>Below is a screen shot of our dashboard showing two servers which were initially identical, hpc701 now has double the RAM.<\/div>\n<div><img decoding=\"async\" src=\"http:\/\/blogs.uct.ac.za\/gallery\/1253\/dynamicRAM.png\" border=\"0\" alt=\"dynamic RAM\"><\/div>\n<div>One of the disadvantages is lack of NUMA. &nbsp;NUMA, or non uniform memory access groups CPUs and RAM by shortest physical access path on the motherboard, ensuring fast computations. &nbsp;A server supporting NUMA will allow NUMA aware software to generally outperform software that cannot select the optimum chip geometry. &nbsp;Windows 2012 R2 supports NUMA, however this is&nbsp;<a href=\"http:\/\/technet.microsoft.com\/en-us\/library\/dn282282.aspx#bkmk_NUMA_Spanning\">disabled when dynamic memory allocation<\/a>&nbsp;is enabled as the hypervisor cannot guarantee optimum geometry for future RAM expansion in a dynamic environment.<\/div>\n<div>Another issue we ran into is the speed at which the RAM is allocated in that several times the worker node ran out of RAM before the hypervisor could allocate additional RAM.<\/div>\n<div><\/div>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[12],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Dynamic memory allocation in the cloud - UCT HPC<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dynamic memory allocation in the cloud - UCT HPC\" \/>\n<meta property=\"og:description\" content=\"Over the last week we&#039;ve been testing our new Hyper-V cloud based HPC architecture. &nbsp;While our 600 series architecture is economical in that there are many cores per server, this forces users to share the same memory space which can lead to contention as our scheduler cannot reserve RAM, and once a job is running the only way to protect memory from a RAM hungry process is to kill it. &nbsp;The cloud based HPC servers can be created on the fly, carved out of whatever resources are available in the Hyper-V environment, in a variety of forms. &nbsp;For instance we can create twenty 4 core servers with 8GB of RAM each, then delete them and for another user create ten 4 core servers with 16GB of RAM each. &nbsp;The resources are thin provisioned so the system can be over subscribed, within reason. &nbsp;So now, instead of having to reserve 64 cores for a user who only needs 1 core but as much RAM as possible we can tailor make an environment that does not hog resources.In addition to this Hyper-V has the ability to dynamically increase RAM to a virtualised operating system which, once again within reason, allows us to oversubscribe our cloud environment. &nbsp;Below is a simple test using a perl script to fill up the worker node&#039;s RAM. &nbsp;The server starts with 8GB of RAM, 100% of which is available. &nbsp;As the RAM is allocated the total amount of RAM on the worker node is dynamically increased up to 17GB.Below is a screen shot of our dashboard showing two servers which were initially identical, hpc701 now has double the RAM.One of the disadvantages is lack of NUMA. &nbsp;NUMA, or non uniform memory access groups CPUs and RAM by shortest physical access path on the motherboard, ensuring fast computations. &nbsp;A server supporting NUMA will allow NUMA aware software to generally outperform software that cannot select the optimum chip geometry. &nbsp;Windows 2012 R2 supports NUMA, however this is&nbsp;disabled when dynamic memory allocation&nbsp;is enabled as the hypervisor cannot guarantee optimum geometry for future RAM expansion in a dynamic environment.Another issue we ran into is the speed at which the RAM is allocated in that several times the worker node ran out of RAM before the hypervisor could allocate additional RAM.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/\" \/>\n<meta property=\"og:site_name\" content=\"UCT HPC\" \/>\n<meta property=\"article:published_time\" content=\"2014-01-29T13:23:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2015-08-14T09:34:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ucthpc.uct.ac.za\/wp-content\/uploads\/2015\/07\/RAM.jpg\" \/>\n<meta name=\"author\" content=\"Andrew Lewis\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andrew Lewis\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/\"},\"author\":{\"name\":\"Andrew Lewis\",\"@id\":\"https:\/\/ucthpc.uct.ac.za\/#\/schema\/person\/c183ad1c0a1063124a72d63963ae9c7e\"},\"headline\":\"Dynamic memory allocation in the cloud\",\"datePublished\":\"2014-01-29T13:23:02+00:00\",\"dateModified\":\"2015-08-14T09:34:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/\"},\"wordCount\":384,\"publisher\":{\"@id\":\"https:\/\/ucthpc.uct.ac.za\/#organization\"},\"articleSection\":[\"Cloud\"],\"inLanguage\":\"en-ZA\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/\",\"url\":\"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/\",\"name\":\"Dynamic memory allocation in the cloud - UCT HPC\",\"isPartOf\":{\"@id\":\"https:\/\/ucthpc.uct.ac.za\/#website\"},\"datePublished\":\"2014-01-29T13:23:02+00:00\",\"dateModified\":\"2015-08-14T09:34:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/#breadcrumb\"},\"inLanguage\":\"en-ZA\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/ucthpc.uct.ac.za\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dynamic memory allocation in the cloud\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/ucthpc.uct.ac.za\/#website\",\"url\":\"https:\/\/ucthpc.uct.ac.za\/\",\"name\":\"UCT HPC\",\"description\":\"University of Cape Town High Performance Computing\",\"publisher\":{\"@id\":\"https:\/\/ucthpc.uct.ac.za\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/ucthpc.uct.ac.za\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-ZA\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/ucthpc.uct.ac.za\/#organization\",\"name\":\"University of Cape Town High Performance Computing\",\"url\":\"https:\/\/ucthpc.uct.ac.za\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-ZA\",\"@id\":\"https:\/\/ucthpc.uct.ac.za\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/ucthpc.uct.ac.za\/wp-content\/uploads\/2015\/09\/logocircless.png\",\"contentUrl\":\"https:\/\/ucthpc.uct.ac.za\/wp-content\/uploads\/2015\/09\/logocircless.png\",\"width\":450,\"height\":423,\"caption\":\"University of Cape Town High Performance Computing\"},\"image\":{\"@id\":\"https:\/\/ucthpc.uct.ac.za\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/ucthpc.uct.ac.za\/#\/schema\/person\/c183ad1c0a1063124a72d63963ae9c7e\",\"name\":\"Andrew Lewis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-ZA\",\"@id\":\"https:\/\/ucthpc.uct.ac.za\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/9652c9c73beeab594b8dc2383a880048?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/9652c9c73beeab594b8dc2383a880048?s=96&d=mm&r=g\",\"caption\":\"Andrew Lewis\"},\"sameAs\":[\"http:\/\/blogs.uct.ac.za\/blog\/big-bytes\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Dynamic memory allocation in the cloud - UCT HPC","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/","og_locale":"en_US","og_type":"article","og_title":"Dynamic memory allocation in the cloud - UCT HPC","og_description":"Over the last week we've been testing our new Hyper-V cloud based HPC architecture. &nbsp;While our 600 series architecture is economical in that there are many cores per server, this forces users to share the same memory space which can lead to contention as our scheduler cannot reserve RAM, and once a job is running the only way to protect memory from a RAM hungry process is to kill it. &nbsp;The cloud based HPC servers can be created on the fly, carved out of whatever resources are available in the Hyper-V environment, in a variety of forms. &nbsp;For instance we can create twenty 4 core servers with 8GB of RAM each, then delete them and for another user create ten 4 core servers with 16GB of RAM each. &nbsp;The resources are thin provisioned so the system can be over subscribed, within reason. &nbsp;So now, instead of having to reserve 64 cores for a user who only needs 1 core but as much RAM as possible we can tailor make an environment that does not hog resources.In addition to this Hyper-V has the ability to dynamically increase RAM to a virtualised operating system which, once again within reason, allows us to oversubscribe our cloud environment. &nbsp;Below is a simple test using a perl script to fill up the worker node's RAM. &nbsp;The server starts with 8GB of RAM, 100% of which is available. &nbsp;As the RAM is allocated the total amount of RAM on the worker node is dynamically increased up to 17GB.Below is a screen shot of our dashboard showing two servers which were initially identical, hpc701 now has double the RAM.One of the disadvantages is lack of NUMA. &nbsp;NUMA, or non uniform memory access groups CPUs and RAM by shortest physical access path on the motherboard, ensuring fast computations. &nbsp;A server supporting NUMA will allow NUMA aware software to generally outperform software that cannot select the optimum chip geometry. &nbsp;Windows 2012 R2 supports NUMA, however this is&nbsp;disabled when dynamic memory allocation&nbsp;is enabled as the hypervisor cannot guarantee optimum geometry for future RAM expansion in a dynamic environment.Another issue we ran into is the speed at which the RAM is allocated in that several times the worker node ran out of RAM before the hypervisor could allocate additional RAM.","og_url":"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/","og_site_name":"UCT HPC","article_published_time":"2014-01-29T13:23:02+00:00","article_modified_time":"2015-08-14T09:34:55+00:00","og_image":[{"url":"https:\/\/ucthpc.uct.ac.za\/wp-content\/uploads\/2015\/07\/RAM.jpg"}],"author":"Andrew Lewis","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Andrew Lewis","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/#article","isPartOf":{"@id":"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/"},"author":{"name":"Andrew Lewis","@id":"https:\/\/ucthpc.uct.ac.za\/#\/schema\/person\/c183ad1c0a1063124a72d63963ae9c7e"},"headline":"Dynamic memory allocation in the cloud","datePublished":"2014-01-29T13:23:02+00:00","dateModified":"2015-08-14T09:34:55+00:00","mainEntityOfPage":{"@id":"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/"},"wordCount":384,"publisher":{"@id":"https:\/\/ucthpc.uct.ac.za\/#organization"},"articleSection":["Cloud"],"inLanguage":"en-ZA"},{"@type":"WebPage","@id":"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/","url":"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/","name":"Dynamic memory allocation in the cloud - UCT HPC","isPartOf":{"@id":"https:\/\/ucthpc.uct.ac.za\/#website"},"datePublished":"2014-01-29T13:23:02+00:00","dateModified":"2015-08-14T09:34:55+00:00","breadcrumb":{"@id":"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/#breadcrumb"},"inLanguage":"en-ZA","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/ucthpc.uct.ac.za\/index.php\/2014\/01\/29\/dynamic-memory-allocation-in-the-cloud\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ucthpc.uct.ac.za\/"},{"@type":"ListItem","position":2,"name":"Dynamic memory allocation in the cloud"}]},{"@type":"WebSite","@id":"https:\/\/ucthpc.uct.ac.za\/#website","url":"https:\/\/ucthpc.uct.ac.za\/","name":"UCT HPC","description":"University of Cape Town High Performance Computing","publisher":{"@id":"https:\/\/ucthpc.uct.ac.za\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ucthpc.uct.ac.za\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-ZA"},{"@type":"Organization","@id":"https:\/\/ucthpc.uct.ac.za\/#organization","name":"University of Cape Town High Performance Computing","url":"https:\/\/ucthpc.uct.ac.za\/","logo":{"@type":"ImageObject","inLanguage":"en-ZA","@id":"https:\/\/ucthpc.uct.ac.za\/#\/schema\/logo\/image\/","url":"https:\/\/ucthpc.uct.ac.za\/wp-content\/uploads\/2015\/09\/logocircless.png","contentUrl":"https:\/\/ucthpc.uct.ac.za\/wp-content\/uploads\/2015\/09\/logocircless.png","width":450,"height":423,"caption":"University of Cape Town High Performance Computing"},"image":{"@id":"https:\/\/ucthpc.uct.ac.za\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/ucthpc.uct.ac.za\/#\/schema\/person\/c183ad1c0a1063124a72d63963ae9c7e","name":"Andrew Lewis","image":{"@type":"ImageObject","inLanguage":"en-ZA","@id":"https:\/\/ucthpc.uct.ac.za\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/9652c9c73beeab594b8dc2383a880048?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9652c9c73beeab594b8dc2383a880048?s=96&d=mm&r=g","caption":"Andrew Lewis"},"sameAs":["http:\/\/blogs.uct.ac.za\/blog\/big-bytes"]}]}},"_links":{"self":[{"href":"https:\/\/ucthpc.uct.ac.za\/index.php\/wp-json\/wp\/v2\/posts\/777"}],"collection":[{"href":"https:\/\/ucthpc.uct.ac.za\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ucthpc.uct.ac.za\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ucthpc.uct.ac.za\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/ucthpc.uct.ac.za\/index.php\/wp-json\/wp\/v2\/comments?post=777"}],"version-history":[{"count":3,"href":"https:\/\/ucthpc.uct.ac.za\/index.php\/wp-json\/wp\/v2\/posts\/777\/revisions"}],"predecessor-version":[{"id":2059,"href":"https:\/\/ucthpc.uct.ac.za\/index.php\/wp-json\/wp\/v2\/posts\/777\/revisions\/2059"}],"wp:attachment":[{"href":"https:\/\/ucthpc.uct.ac.za\/index.php\/wp-json\/wp\/v2\/media?parent=777"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ucthpc.uct.ac.za\/index.php\/wp-json\/wp\/v2\/categories?post=777"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ucthpc.uct.ac.za\/index.php\/wp-json\/wp\/v2\/tags?post=777"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}